Rails form validation conditional bypass

2019-01-17 04:37发布

问题:

I have a rails model that validates uniqueness of 2 form values. If these 2 values aren't unique the validation errors are shows and the "submit" button is changed to "resubmit". I want to allow a user to click the "resubmit" button and bypass the model validation. I want to do something like this from the rails validation documentation:

validates_uniqueness_of :value, :unless => Proc.new { |user| user.signup_step <= 2 }

but I don't have a a value in my model that I can check for...just the params that have the "Resubmit" value.

Any ideas on how to do this?

回答1:

In my opinion this is the best way to do it:

class FooBar < ActiveRecord::Base
  validates_uniqueness_of :foo, :bar, :unless => :force_submit
  attr_accessor :force_submit
end

then in your view, make sure you name the submit tag like

<%= submit_tag 'Resubmit', :name => 'foo_bar[force_submit]' %>

this way, all the logic is in the model, controller code will stay the same.



回答2:

Try this:

Rails 2: Model.save(false)
Rails 3: Model.save(:validate => false)

It bypasses validations (all of them though).



回答3:

Not positive about this, but you could try to add an attr_accessor to your model to hold whether or not the form has been submited once before.

just add

attr_accessor :submitted

to your model and check for it in your validations.



回答4:

You can just look at the submit button to determine whether you want to perform the validations.

def form_method
  case params[:submit]
    when "Submit" 
      'Do your validation here'
    when "Resubmit" 
      'Do not call validation routine'
  end
end