Rails条件验证

时间:2011-09-05 19:32:35

标签: 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_many :screens
  attr_accessible :access

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

谢谢

2 个答案:

答案 0 :(得分:21)

变化:

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

使用:

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

由于:

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

  • 如果您的屏幕没有任何用户,仅仅screen.user.access会抛出异常

答案 1 :(得分:1)

您将一个字符串传递给: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