Ruby on rails Rails条件验证

Ruby on rails Rails条件验证,ruby-on-rails,validation,Ruby On Rails,Validation,我这里有两个模型: 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_ma

我这里有两个模型:

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
类屏幕{:小于或等于100,:大于或等于0=>0},:if=>“user.access==1”
类用户
但是这段代码不起作用,因为无论user.access的值是多少,它都将执行验证。我做错了什么

谢谢您更改:

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

因为:

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

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


您将字符串传递给:if executable 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
类屏幕{:小于或等于100,:大于或等于0=>0},:如果=>lambda{s | s.user.access==1}
结束
类用户
我也会使用proc,但是,它应该接受一个字符串,以便在保存的记录的范围内进行计算。我想知道
self.user.try(:access)==1
是否有效?根据,这对于Rails 3来说是不正确的(我不记得2是否是这样)。一个符号将引用一个方法,一个字符串将在记录的范围内求值。
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