Rails 4 nested attributes and has_many :through associaton in a form

前端 未结 1 633
清酒与你
清酒与你 2020-11-29 20:58

I am having an issue managing a has_many :through association using a form. What I DON\'T want to do is edit the attributes of the associated model of which there is a pleth

相关标签:
1条回答
  • 2020-11-29 21:47

    When employing a has_many :through relationship, you need to pass the nested_attributes through the different models, like this:

    Models

    class Goal < ActiveRecord::Base
      has_many :milestones, inverse_of: :goal, dependent: :destroy
      accepts_nested_attributes_for :milestones, :allow_destroy => true
    
      def self.build
          goal = self.new
          goal.milestones.build.milestone_programs.build_program
      end
    end
    
    class Milestone < ActiveRecord::Base
      belongs_to :goal, inverse_of: :milestones
    
      has_many :milestone_programs
      has_many :programs, through: :milestone_programs
    
      accepts_nested_attributes_for :milestone_programs
    end
    
    class MilestoneProgram < ActiveRecord::Base
        belongs_to :milestone
        belongs_to :program
    
        accepts_nested_attributes_for :program
    end
    
    class Program
        has_many :milestone_programs
        has_many :milestones, through: :milestone_programs
    end
    

    Controller

    #app/controllers/goals_controller.rb
    def new
        @goal = Goal.build
    end
    
    def create
        @goal = Goal.new(goal_params)
        @goal.save
    end
    
    private
    
    def goal_params
        params.require(:goal).permit(milestones_attributes: [milestone_programs_attributes: [program_attributes:[]]])
    end
    

    Form

    #app/views/goals/new.html.erb
    <%= form_for @goal do |f| %>
       <%= f.fields_for :milestones do |m| %>
          <%= m.fields_for :milestone_programs do |mp| %>
              <%= mp.fields_for :program do |p| %>
                   <%= p.text_field :name %>
              <% end %>
          <% end %>
       <% end %>
       <%= f.submit %>
    <% end %>
    

    I appreciate this might not be exactly what you're looking for, but tbh I didn't read all your prose. I just gathered you needed help passing nested_attributes through a has_many :through relationship

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