Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Validate model for certain action

I need to validate a model only for a certain action (:create). I know this is not a good tactic, but i just need to do this in my case.

I tried using something like :

validate :check_gold, :if => :create

or

validate :check_gold, :on => :create

But i get errors. The problem is that i cannot have my custom check_gold validation execute on edit, but only on create (since checking gold has to be done, only when alliance is created, not edited).

Thanx for reading :)


I'm appending some actual code :

  attr_accessor :required_gold, :has_alliance
  validate :check_gold
  validate :check_has_alliance

This is the Alliance model. :required_gold and :has_alliance are both set in the controller(they are virtual attributes, because i need info from the controller). Now, the actual validators are:

  def check_gold
    self.errors.add(:you_need, "100 gold to create your alliance!") if required_gold < GOLD_NEEDED_TO_CREATE_ALLIANCE
  end

  def check_has_alliance
    self.errors.add(:you_already, "have an alliance and you cannot create another one !") if has_alliance == true
  end

This works great for create, but i want to restrict it to create alone and not edit or the other actions of the scaffold.

like image 343
Spyros Avatar asked Feb 25 '26 18:02

Spyros


1 Answers

All ActiveRecord validators have a :on option.

validates_numericality_of :value, :on => :create 

Use the validate_on_create callback instead of validate:

validate_on_create :check_gold
validate_on_create :check_has_alliance

Edit:

If you use validates_each you can use the standard options available for a validator declaration.

validates_each :required_gold, :has_alliance, :on => :create do |r, attr, value|
  r.check_gold if attr == :required_gold
  r.check_has_alliance if attr == :has_alliance
end
like image 159
Harish Shetty Avatar answered Feb 28 '26 09:02

Harish Shetty



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!