Rail Check Context

I need help with my ActiveRecord model. I have context-based validations (incorrectly) using the built-in context options to validate:

validates :foo, :on => :bar, :presence => true

model = Model.new
model.foo = nil
model.valid? # => true
model.save # works as expected

model.valid?(:bar) # => false
model.save(:context => :bar) # fails and returns false

But using my model in accepts_nested_attributes_for :modeland the call parent.savefails (confirmation is called and returns false), any suggestions or solutions?


Still no answer? To learn more about my problem: I have a model called Formthat has many Fields. Users should see validation errors for submit, but the form should be saved anyway (with errors and without errors). There are various types of Fields, each with global checks (to ensure database consistency) and its own specific user checks (to check user input). So mine Fieldlooks like this:

 # Global validations, to ensure database consistency
 # If this validations fail, the record should not be saved!
 validates_associated :form, :on => :global
 ...

 # Specific user-defined validations
 # If this validations fail, the record should be saved but marked as invalid. (Which is done by a before_save filter btw.)
 def validate
   validations.each do |validation| # Array of `ActiveModel::Validations`, defined by the user and stored in a hash in the database
     validation.new(:on => :specific).validate(self)
   end
 end

In my controller:

 # def create
 # ...
 form.attributes = params[:form]
 form.save!(:global)
 form.save(:specific)

Is something like this possible in Rails using inline functions? By the way, this is not my actual code, which is rather complicated. But I hope you guys come up with.

+5
3

class Customer 
  attr_accessor :managing 

  validates_presence_of :first_name
  validates_presence_of :last_name 

  with_options :unless => :managing do |o|
    o.validates_inclusion_of :city, :in=> ["San Diego","Rochester"]
    o.validates_length_of :biography, :minimum => 100 
  end
end

@customer.managing = true
@customer.attributes = params[:customer]
@customer.save
+6
+5

Change has_nested_attributes_for :modelto accepts_nested_attributes_for :models.

Hope this helps.

Good luck.

0
source

All Articles