복붙노트

[RUBY-ON-RAILS] 형태로 협회를 통해 4 개 중첩 된 속성과 has_many 레일

RUBY-ON-RAILS

형태로 협회를 통해 4 개 중첩 된 속성과 has_many 레일

나는 has_many 관리 문제를 겪고 : 협회를 통해 양식을 사용하여. 내가하고 싶지 않아하는 것은 거기 정보의 과다가있는 관련 모델의 속성이 아니라, 난 단지 연결을 관리 할 편집이다. 난 내 행동에 전달 된 형식 매개 변수를 조작하여이 작업을 수행 할 수동으로 관계를 만들 수 이해하지만, 그것이 가능하다면 나는 레일 길을 갈 것을 선호합니다.

협회를 통해 이미 accepts_nested_attributes_for 사용하여 저장하고 모델에 실제로 : 내 경우에 대한 한 가지 흥미로운 점은이 has_many가 있다는 것입니다

여기 내 모델입니다 : 목표, 연혁 및 프로그램.

class Goal < ActiveRecord::Base
  has_many :milestones, inverse_of: :goal, dependent: :destroy
  accepts_nested_attributes_for :milestones, :allow_destroy => true
end

class Milestone < ActiveRecord::Base
  belongs_to :goal, inverse_of: :milestones

  has_many :milestone_programs
  has_many :programs, :through => :milestone_programs
end

class Program < ActiveRecord::Base
end

이제 내 목표 편집보기에, 내가 추가하고 이정표를 제거 할 수 있어야하고, 그 이정표 내가 추가 및 제거 프로그램 연결 할 수 있어야합니다. 이것은 나의 양식에 대한 코드입니다.

<%= form_for @goal do |f| %>

  <%= f.fields_for :milestones do |f_milestone| %>

    <%= f.hidden_field :id, :value => f.object.id %>
    <%= f.hidden_field :name, :value => f.object.name %>
    <a href="javascript:void(0)" class="milestone-remove">- remove</a>

    <ul>
      <%= f.fields_for :programs do |f_prog| %>
        <li>
          <%= f_prog.object.name %>
          <a href="javascript:void(0)" class="program-remove">- remove</a>
        </li>
      <% end %>
    </ul>

  <% end %>

  <%= f.submit 'Save' %>

<% end %>

내 컨트롤러에서 나는이

class GoalsController < ApplicationController

    # PATCH/PUT /goals/:id
    def update
      if @goal.update(goal_params)
        redirect_to @goal
      end
    end

    def goal_params
      params.require(:goal).permit(:name, :milestones_attributes => [ :id, :name, :_destroy ])
    end

end

이 양식을 변경할 수 있으며, 나는 그런 도움이됩니다 누에 고치거나 nested_forms 등의 보석을 생각하지 않도록에만 변경 사항 저장하면, 마지막에 저장 클릭하면 워크 시트처럼 될 필요가있다.

내 코드 내 목표 관련 연혁 및 해당 속성을 관리하기 위해 지금까지 완벽하게 작동합니다. 하지만 지금은 그 이정표에 관련된 프로그램의 목록을 관리 할 수 ​​있어야합니다.

내가 accepts_nested_attributes_for 사용하여 시도했지만 그게 아니 내가 편집에 모델의 중첩 된 속성을 상관하지 않기 때문에 내가 원하는 정확히 무엇이며, 프로그램의 속성은 정적으로 유지한다.

나는 내가 연결을 구축하기 위해 각 프로그램에 대한 내 양식이 같은 뭔가를 할 수있을 거라고 생각 :

<input type="hidden" name="goal[milestones_attributes][1][program_ids][1]" >

그러나 그 작업 중 하나 (내 흰색으로 등재 된 매개 변수 program_ids을 물론 추가 한의)하지 않습니다. 내 컨트롤러에 추가 할 필요가 마법의 레일 방법이 있습니까?

내가 무슨 말이냐?

사전에 감사합니다!

해결법

  1. ==============================

    1.has_many을 사용하는 경우 : 관계를 통해,이 같은 다른 모델을 통해 nested_attributes을 전달해야합니다 :

    has_many을 사용하는 경우 : 관계를 통해,이 같은 다른 모델을 통해 nested_attributes을 전달해야합니다 :

    모델

    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
    

    제어 장치

    #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
    

    형태

    #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 %>
    

    나는이 힘은 당신이 찾고있는 정확하게하지 고맙지 만 TBH 나는 당신의 산문을 모두 읽지 않았다. 관계를 통해 : 난 그냥 당신이 has_many을 통해 nested_attributes을 통과 도움이 필요 모여

  2. from https://stackoverflow.com/questions/21983131/rails-4-nested-attributes-and-has-many-through-associaton-in-a-form by cc-by-sa and MIT license