未定义的方法和未初始化的常量错误

Posted

技术标签:

【中文标题】未定义的方法和未初始化的常量错误【英文标题】:Undefined method and uninitialized constant error 【发布时间】:2016-02-28 20:11:53 【问题描述】:

大家好,我正在尝试使用 gibbon gem 集成 Mailchimp API,但我不断收到 error undefined methodsave'`。

我的控制器代码:

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,那么您可能拼错了RequestsaveActiveRecord 方法,而不是 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::Validationsinclude 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

C++ 库的 JNI 包装器和未定义的符号错误

为啥它显示像 ld 返回 1 退出状态和未定义的引用 `powr(int, int)' 之类的错误

phonegap 3 条形码扫描仪和未定义的错误