未定义的方法和未初始化的常量错误
Undefined method and uninitialized constant error
大家好,我正在尝试使用长臂猿 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
我已经尝试了至少十几种不同的修复方法。我尝试了不同版本的 gibbon gem,似乎没有任何效果。我已经尝试对我的 API 密钥进行硬编码,而不是从 secrets.yml 获取它。我现在有 运行 个选项,其他问题 google。我的问题似乎没有解决方案。
非常感谢任何可能的帮助,如果您需要我项目中的任何其他代码,请告诉我。
编辑:
我能够通过添加 ActiveRecord::Base
而不是 include ActiveModel::Model
来消除 undefined method save
错误。但我仍然收到 uninitialized constant Gibbon::Request
错误。
您的代码存在几个问题:
- 如果您的错误是
uninitialized constant Gibbon::Resquest in subscriber.rb
,那么您可能拼错了 Request
;
save
是一种 ActiveRecord
方法,而不是 ActiveModel
方法。所以你的模型应该继承自 ActiveRecord::Base
而不是包含 ActiveModel::Model
;
- 除非您包含
ActiveModel::Validations
. ,否则您的验证将不起作用
话虽如此,你用的gem是没有问题的。如果您将正确的超类添加到您的模型并删除 include
,事情应该会按预期工作。
关于一直找不到常量的问题,请问您在Gemfile
中添加了gem 'gibbon'
,之后添加了运行 bundle
吗?要检查,请启动 Rails 控制台并查看 gem 是否已加载:
$ rails c
>> Gibbon
...
>> Gibbon::Request
...
大家好,我正在尝试使用长臂猿 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
我已经尝试了至少十几种不同的修复方法。我尝试了不同版本的 gibbon gem,似乎没有任何效果。我已经尝试对我的 API 密钥进行硬编码,而不是从 secrets.yml 获取它。我现在有 运行 个选项,其他问题 google。我的问题似乎没有解决方案。
非常感谢任何可能的帮助,如果您需要我项目中的任何其他代码,请告诉我。
编辑:
我能够通过添加 ActiveRecord::Base
而不是 include ActiveModel::Model
来消除 undefined method save
错误。但我仍然收到 uninitialized constant Gibbon::Request
错误。
您的代码存在几个问题:
- 如果您的错误是
uninitialized constant Gibbon::Resquest in subscriber.rb
,那么您可能拼错了Request
; save
是一种ActiveRecord
方法,而不是ActiveModel
方法。所以你的模型应该继承自ActiveRecord::Base
而不是包含ActiveModel::Model
;- 除非您包含
ActiveModel::Validations
. ,否则您的验证将不起作用
话虽如此,你用的gem是没有问题的。如果您将正确的超类添加到您的模型并删除 include
,事情应该会按预期工作。
关于一直找不到常量的问题,请问您在Gemfile
中添加了gem 'gibbon'
,之后添加了运行 bundle
吗?要检查,请启动 Rails 控制台并查看 gem 是否已加载:
$ rails c
>> Gibbon
...
>> Gibbon::Request
...