未定义的方法和未初始化的常量错误
Posted
技术标签:
【中文标题】未定义的方法和未初始化的常量错误【英文标题】:Undefined method and uninitialized constant error 【发布时间】:2016-02-28 20:11:53 【问题描述】:大家好,我正在尝试使用 gibbon gem 集成 Mailchimp API,但我不断收到 error undefined method
save'`。
我的控制器代码:
class LandingPageController < ApplicationController
layout 'landing_page'
def index
@subscriber = Subscriber.new
end
def create
# Instantiate a new object using form parameters
@subscriber = Subscriber.new(subscriber_params)
# Save the object
if @subscriber.save
@subscriber.valid?
@subscriber.subscribe
# If save succeeds, redirect to the index action
flash[:notice] = "Thank You for subscribing. Your Email ID has been entered successfully into our database."
redirect_to(:action => 'index')
else
# If save fails, redisplay the form so user can fix problems
render('index')
end
end
private
def subscriber_params
# same as using "params[:subject]", except that it:
# - raises an error if :subject is not present
# - allows listed attributes to be mass-assigned
params.require(:subscriber).permit(:email)
end
end
这在开始集成之前运行良好。
所以为了调试错误,我删除了@subscriber.save
看看会发生什么。然后我收到一个新错误uninitialized constant Gibbon::Request in subscriber.rb
。
我的subscriber.rb 代码:
class Subscriber
include ActiveModel::Model
attr_accessor :email, :string
validates_presence_of :email
validates_format_of :email, with: /\A[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]2,4\z/i
def subscribe
mailchimp = Gibbon::Request.new(api_key: Rails.application.secrets.mailchimp_api_key)
result = mailchimp.lists.subscribe(
:id => Rails.application.secrets.mailchimp_list_id,
:email => :email => self.email,
:double_optin => false,
:update_existing => true,
:send_welcome => true
)
Rails.logger.info("Subscribed #self.email to MailChimp") if result
end
end
我已经尝试了至少十几种不同的修复方法。我尝试了不同版本的长臂猿宝石,似乎没有任何效果。我尝试对我的 API 密钥进行硬编码,而不是从 secrets.yml 中获取它。我现在已经没有选项了,还有其他关于谷歌的问题。我的问题似乎没有解决方案。
如果您需要我项目中的任何其他代码,我们将不胜感激。
编辑:
我可以通过添加ActiveRecord::Base
而不是include ActiveModel::Model
来消除undefined method save
错误。但我仍然收到uninitialized constant Gibbon::Request
错误。
【问题讨论】:
我只是在问题中拼错了。它就在我的代码中。 不要在问题中拼错,修正它,以便我们阅读时正确。此外,修复代码的格式,使其可读。事实上,它不容易阅读,这会减慢甚至阻碍答案。 【参考方案1】:您的代码有几个问题:
如果您的错误是uninitialized constant Gibbon::Resquest in subscriber.rb
,那么您可能拼错了Request
;
save
是 ActiveRecord
方法,而不是 ActiveModel
方法。所以你的模型应该继承自ActiveRecord::Base
,而不是包含ActiveModel::Model
;
除非您包含 ActiveModel::Validations
,否则您的验证将不起作用。
话虽如此,您使用的宝石没有问题。如果您将正确的超类添加到您的模型并删除 include
,那么您应该可以正常工作。
关于未找到常量的持久性,您是否在Gemfile
中添加了gem 'gibbon'
并在之后运行bundle
?要检查,请启动 Rails 控制台并查看 gem 是否已加载:
$ rails c
>> Gibbon
...
>> Gibbon::Request
...
【讨论】:
对不起,我有点糊涂了。 当我将ActiveRecord::Base
添加到模型中并删除@subscriber.valid?
和@subscriber.subscribe
时,它工作得很好,但是当我将它们都添加回来时会出现错误uninitialized constant Gibbon::Request
。现在,当我添加 include ActiveModel::Validations
或 include ActiveModel::Model
而不是 ActiveRecord::Base
时,我仍然会收到未初始化的错误。
您不必删除任何这些方法;通过添加ActiveRecord::Base
作为超类,您实际上使它们工作。如果你删除了@subscriber.subscribe
,为什么它会抛出这个错误,因为你没有在任何地方调用Gibbon::Request
?
它仍然无法正常工作。我仍然收到uninitialized constant Gibbon::Request
错误。
当我输入 Gibbon 时,控制台回复了 Gibbon
,当我输入 Gibbon::Request
时,我得到了 NameError: uninitialized constant Gibbon::Request
。以上是关于未定义的方法和未初始化的常量错误的主要内容,如果未能解决你的问题,请参考以下文章
无法连接到本地 PHP 站点(未定义索引和未定义变量错误)[重复]
错误: - 未定义引用 `_imp__GetStockObject@4' 和未定义引用 `_imp__SetBkMode@8'
Bootstrap 设置错误:未捕获 ReferenceError:未定义 jQuery 和未捕获错误:Bootstrap 的 JavaScript 需要 jQuery