accepts_nested_attributes_for child association validation failing

后端 未结 6 2040
隐瞒了意图╮
隐瞒了意图╮ 2020-12-02 07:02

I\'m using accepts_nested_attributes_for in one of my Rails models, and I want to save the children after creating the parent.

The form works perfectly, but the vali

相关标签:
6条回答
  • 2020-12-02 07:40

    You could just create the project and only add the projects if it passes validation:

    tasks = params.delete(:task_attributes)
    if Project.create(params)
      Project.update_attributes(:task_attributes => tasks)
    end
    

    Ciao

    0 讨论(0)
  • 2020-12-02 07:41

    Use :inverse_of and validates_presence_of :parent. This should fix your validation problem.

       class Dungeon < ActiveRecord::Base
         has_many :traps, :inverse_of => :dungeon
       end
    
       class Trap < ActiveRecord::Base
         belongs_to :dungeon, :inverse_of => :traps
         validates_presence_of :dungeon
       end
    

    http://apidock.com/rails/ActiveModel/Validations/HelperMethods/validates_presence_of

    https://github.com/rails/rails/blob/73f2d37505025a446bb5314a090f412d0fceb8ca/activerecord/test/cases/nested_attributes_test.rb

    0 讨论(0)
  • 2020-12-02 07:41

    Contrary to what bigo suggests, it's not always acceptable to save the parent object first and then the children. Usually you want to make sure all objects validate before you start saving them. That gives the user the chance to re-edit the input form and correct any errors.

    The problem you describe will be fixed in Rails 3.0. I would have posted a link to the Lighthouse ticket, but stackoverflow.com does not allow this because I'm a new user (#fail). But for the time being, you can use the plugin "parental_control", which will fix your "bug".

    0 讨论(0)
  • 2020-12-02 07:47

    Only validate the relationship, not the ID:

    class Task < ActiveRecord::Base
      belongs_to :project
    
      validates_presence_of :project
    end
    

    As soon as the association is populated, ActiveRecord will consider the validation to have succeeded, whether or not the model is saved. You might want to investigate autosaving as well, to ensure the task's project is always saved:

    class Task < ActiveRecord::Base
      belongs_to :project, :autosave => true
    
      validates_presence_of :project
    end
    
    0 讨论(0)
  • 2020-12-02 08:03

    Use this answer for Rails 2, otherwise see below for the :inverse_of answer

    You can work around this by not checking for the project_id if the associated project is valid.

    
    class Task < ActiveRecord::Base
      belongs_to :project
    
      validates_presence_of :project_id, :unless => lambda {|task| task.project.try(:valid?)}
      validates_associated :project
    end
    
    0 讨论(0)
  • 2020-12-02 08:03

    Unfortunately none of the above suggestions work for me with Rails 2.3.5.

    In my case, the project in a task is always nil if both are created using nested attributes. Only if I remove the validates_presence_of, the create goes through successfully. The unit test and the log show that all is created correctly.

    So I'd now tend to add constraints to the DB instead of Rails as that seems to be more reliable in the first place.

    0 讨论(0)
提交回复
热议问题