【问题标题】:Access class methods from inclusion validation从包含验证访问类方法
【发布时间】:2014-08-21 01:54:55
【问题描述】:

我想在使用包含验证时包含一个类方法作为我的选项:

class Search < ActiveRecord::Base

  attribute :foo, Array
  validates :foo, inclusion: class_method_options

  def self.class_method_options
   ['foo', 'bar']
  end
end

但是我得到undefined method 'class_method_options' for Search:Class (NoMethodError)

我尝试在谷歌上搜索解决方案,但刚刚找到了如何创建自定义验证。我不需要全新的验证,我只想使用标准的 Rails 包含验证器。如何通过包含验证访问 class_method_options

【问题讨论】:

    标签: ruby-on-rails validation class-method


    【解决方案1】:

    只是还没有定义。

    class Search < ActiveRecord::Base
      def self.class_method_options
       ['foo', 'bar']
      end
    
      attribute :foo, Array
      validates :foo, inclusion: class_method_options
    
    end
    

    这可行,或者你可以这样做:

    class Search < ActiveRecord::Base
      class_method_options = ['foo', 'bar']
    
      attribute :foo, Array
      validates :foo, inclusion: class_method_options
    
    end
    

    【讨论】:

    • 方法名不需要是符号吗?
    • @RichPeck,不,在这种情况下,您只是在班级级别调用它。正如我在下面所说,包含在需要一个可枚举的,或者一个返回和可枚举的过程。在这种情况下,没有 Rails 魔术可以根据符号为您调用方法。
    【解决方案2】:

    鉴于 :in 接受 Proc,我最终得到了

    validates :foo, inclusion: { in: Proc.new { |search| search.class.class_method_options } }
    

    【讨论】:

      【解决方案3】:

      你必须这样做

      class Search < ActiveRecord::Base
      
        attribute :foo, Array
        validates :foo, inclusion: {in: :class_method_options }
      
        def class_method_options
         ['foo', 'bar']
        end
      end
      

      【讨论】:

      • 这实际上不起作用。您必须传递一个可枚举或返回可枚举的过程。如果您将其更改为{ in: &amp;:class_method_options },这可能会起作用,但我尚未对其进行测试。更多关于包含验证的信息:apidock.com/rails/ActiveModel/Validations/HelperMethods/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多