Validate number of nested attributes

前端 未结 3 1963
傲寒
傲寒 2021-01-19 14:50

I have a model with nested attributes :

class Foo < ActiveRecord::Base
    has_many :bar
    accepts_nested_attributes_for  :bar
end

It

相关标签:
3条回答
  • 2021-01-19 15:11

    Tony's answer actually won't handle the case where an existing Foo's bars are deleted.

    Since validation of the parent (Foo) happens before the nested children (Bars) are destroyed, Foo will pass validation, then the bars will be destroyed and there will be no errors presented to the user.

    I'd add this as a comment but as of now don't have enough reps

    0 讨论(0)
  • 2021-01-19 15:12
    class Foo < ActiveRecord::Base
      has_many :bars
      accepts_nested_attributes_for  :bar
    
      def validate
        if self.bars.reject(&:marked_for_destruction?).length < 2
          self.errors.add_to_base("Must have at least 2 bars")
        end
      end
    end
    

    The controller will take care of building/updating the bars so you just need to see if you have enough.

    0 讨论(0)
  • 2021-01-19 15:20

    Just in case anyone seeing this needs it to work for Rails 3. I think the add_to_base (that Tony and Jeremy use) has been removed so it needs to be like so:

    class Foo < ActiveRecord::Base
      has_many :bars
      accepts_nested_attributes_for  :bar
    
      def validate
        if self.bars.reject(&:marked_for_destruction?).length < 2
          self.errors.add(:base, "Must have at least 2 bars")
        end
      end
    end
    
    0 讨论(0)
提交回复
热议问题