Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails Conditional Validation

So I have two models here:

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

But this code doesn't work, cause no matter what value the user.access is, it will still execute the validation. What am I doing wrong here?

Thank you

like image 627
zsljulius Avatar asked Sep 05 '11 19:09

zsljulius


2 Answers

change:

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

with:

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

Because:

  • you need to pass a function to evaluate condition on the fly

  • if your screen doesn't have any user, a mere screen.user.access would throw an exception

like image 182
apneadiving Avatar answered Oct 03 '22 07:10

apneadiving


You passed in a string to the :if executable proc/function parameter. When this is a string, it tries to find a function with that name. What you actually want is an anonymous function here using a 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
like image 30
Winfield Avatar answered Oct 03 '22 07:10

Winfield