【问题标题】:Why do I get an undefined method when calling model method为什么我在调用模型方法时得到一个未定义的方法
【发布时间】:2015-08-03 16:19:17
【问题描述】:

我有一个模型,方法如下

 class Legacy::Retailer < ActiveRecord::Base
  belongs_to :retailers
  self.table_name = 'orim_retailers'

  def retailer_options
    retailers = Array.new
    self.display_name.each do |names|
      retailers << names
    end
  end

end

当我尝试从控制器调用此方法时

@retailer_options = Legacy::Retailer.retailer_options

我得到一个方法未定义的方法错误。我不确定我做错了什么。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4


    【解决方案1】:

    因为你定义了一个实例方法,而不是一个类方法。

    能够打电话

    Legacy::Retailer.retailer_options
    

    你应该定义一个类方法:

      def self.retailer_options # note self here
        retailers = Array.new
        self.display_name.each do |names|
          retailers << names
        end
      end
    

    如果您打算在实例而不是类本身上调用此方法,您应该能够执行以下操作:

    Legacy::Retailer.new.retailer_options
    

    【讨论】:

      【解决方案2】:

      方法retailer_options 被定义为实例方法,并且您正在调用类方法。看看下面的代码:

      class Foo
        def self.bar
          puts 'class method'
        end
      
        def baz
          puts 'instance method'
        end
      end
      

      如果你打电话:

      Foo.bar # => "class method"
      Foo.baz # => NoMethodError: undefined method ‘baz’ for Foo:Class
      

      对于实例方法:

      Foo.new.baz # => instance method
      Foo.new.bar # => NoMethodError: undefined method ‘bar’ for #<Foo:0x1e820>
      

      希望现在更清楚

      【讨论】:

        【解决方案3】:

        您已经定义了一个实例方法,但您将其作为类方法调用。

        @retailer = Legacy::Retailer.new
        @retailer.retailer_options
        

        会起作用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-22
          • 1970-01-01
          • 2015-07-06
          • 1970-01-01
          • 1970-01-01
          • 2016-07-31
          • 2016-07-06
          • 2013-04-24
          相关资源
          最近更新 更多