【问题标题】:Rails Conditional ValidationRails 条件验证
【发布时间】:2011-09-05 19:32:35
【问题描述】:

所以我这里有两个模型:

class Screen < ActiveRecord::Base
  belongs_to :user
  validates :screen_size, :numericality =>{:less_than_or_equal_to =>100,:greater_than_or_equal_to => 0},:if => "user.access==1"

class User < ActiveRecord::Base
  has_many :screens
  attr_accessible :access

但是这段代码不起作用,因为无论 user.access 是什么值,它仍然会执行验证。我在这里做错了什么?

谢谢

【问题讨论】:

    标签: ruby-on-rails validation


    【解决方案1】:

    改变:

    :if => "user.access==1"
    

    与:

    :if => lambda { |screen| screen.user.try(:access) ==1 }
    

    因为:

    • 您需要传递一个函数来动态评估条件

    • 如果您的屏幕没有任何用户,那么仅仅screen.user.access 就会引发异常

    【讨论】:

    • 我也会使用 proc,但是通过the docs,它应该接受一个字符串以在已保存记录的范围内进行评估。我想知道self.user.try(:access) == 1 是否可行?
    【解决方案2】:

    您将一个字符串传递给 :if 可执行的 proc/function 参数。当这是一个字符串时,它会尝试查找具有该名称的函数。你真正想要的是一个使用 lambda 的匿名函数。

    class Screen < ActiveRecord::Base
      belongs_to :user
      validates :screen_size, :numericality => {:less_than_or_equal_to =>100, :greater_than_or_equal_to => 0}, :if => lambda {|s| s.user.access == 1 }
    end
    
    class User < ActiveRecord::Base
      has_many :screens
      attr_accessible :access
    end
    

    【讨论】:

    • 根据the docs,这对于 Rails 3 是不正确的(我不记得是否是 2 中的情况)。一个符号将引用一个方法,一个字符串在记录的范围内被评估。
    猜你喜欢
    • 2015-05-14
    • 1970-01-01
    • 2013-09-10
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 2012-02-25
    相关资源
    最近更新 更多