Better validates_associated method for Rails 3?

后端 未结 4 740
猫巷女王i
猫巷女王i 2021-02-04 03:47

Rails 3 includes the validates_associated which is automatically called when saving a nested model. The problem with the method is the message is terrible - \"Mode

4条回答
  •  深忆病人
    2021-02-04 04:24

    On the relationship, you can use :autosave => true instead which will try to save children models when you save the parent. This will automatically run the validations of the children and they will report with proper error messages.

    Moreover, if you add a presence validation on the child that the parent must be set, and you construct the child objects through the association, you don't even need the autosave flag, and you get a beautiful error message. For example:

    class Trip < ActiveRecord::Base
      validates :name, :presence => true
    
      attr_accessible :name
    
      has_many :places, dependent: :destroy, :inverse_of => :trip
    end
    
    class Place < ActiveRecord::Base
      belongs_to :trip
    
      validates :name, :trip, presence: true
    
      attr_accessible :name
    end
    

    Then you can get an nice error message with the following usage scenario:

    > trip = Trip.new(name: "California")
    => # 
    > trip.places.build
    => #
    > trip.valid?
    => false
    > trip.errors
    => #, @messages={:places=>["is invalid"]}>
    > trip.errors[:places]
    => ["is invalid"] 
    

    I think validates_associated is a relic of the era before autosaving of children and isn't the best way to do things any more. Of course that's not necessarily documented well. I'm not 100% sure that this also applies to Rails 2.3, but I have a feeling it does. These changes came when the nested attributes feature was added (which was sometime in 2.x).

    This is a simplified snippet of code from a training project I posted on github.

提交回复
热议问题