【问题标题】:No method error for validates_inclusion_ofvalidates_inclusion_of 没有方法错误
【发布时间】:2012-05-28 12:29:08
【问题描述】:

我有一个模特代表

class Representative< ActiveRecord::Base
  validates_inclusion_of :gender, :in => Representative.genders

  def self.genders
    %w(M F)
  end
end

当我在性别函数定义之前编写验证行时,它不起作用,它给出了未定义的方法性别错误。当我在它起作用的函数下方编写验证时,为什么会发生这种情况?我习惯于调用和定义函数而不必担心顺序,我这里真的有什么问题吗?

谢谢

【问题讨论】:

    标签: ruby-on-rails-3 validation activerecord


    【解决方案1】:

    Ruby 逐行执行代码,就像 shime 解释的那样。 因此,在运行validates_inclusion_of 时,它会尝试查找方法genders。它当时找不到该方法,因此会引发错误。最好将该方法上移或简单地定义常量。

    最好检查错误中的回溯,并尝试理解它。

    class Representative < ActiveRecord::Base
      def self.genders
        %w(M F)
      end
    
      validates_inclusion_of :gender, :in => Representative.genders
    end
    

    这是您定义常量的方式,以便您以后可以通过调用 Representative::GENDERS 来访问它。

    class Representative < ActiveRecord::Base
      GENDERS = %w(M F)
    
      validates_inclusion_of :gender, :in => GENDERS
    end
    

    【讨论】:

    • 我知道我做错了什么。简单定义一个常量是什么意思?
    【解决方案2】:

    您在这里将一个方法调用作为参数传递给另一个方法。

    让我用例子来解释一下

    class Printer
      def print(something)
        print something
      end
    
    
      print sheet
    
      def sheet
        "sheet!"
      end
    end
    

    在这里你会得到一个NameError - 未定义的局部变量或方法sheet

    发生的情况是 ruby​​ 尝试评估您的表达式,并看到 sheet 是一个方法调用。然后它调用该方法并抛出这种错误。

    如果您将方法定义移到方法调用之上 - 它已定义。

    class Printer
      def print(something)
        puts something
      end
    
      def sheet
        "sheet!"
      end
    
      print sheet
    end
    

    【讨论】:

    • 对此感到抱歉..在我的代码中发布问题时这是一个错字我有正确的 validates_inclusion_of 并且它给我错误未定义的类#XXXYY的方法性别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2023-03-29
    • 2012-11-09
    • 1970-01-01
    • 2011-08-21
    • 2011-02-08
    • 2012-10-07
    相关资源
    最近更新 更多