[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.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을 통과 도움이 필요 모여
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
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 유증 + Omniauth - 어떻게 함께 추가 매개 변수를 전달하는 방법? (0) | 2020.02.18 |
---|---|
[RUBY-ON-RAILS] 레일 Gemfile의 사용은 무엇입니까? (0) | 2020.02.18 |
[RUBY-ON-RAILS] 검증 URL / 도메인에 대한 정규식을 사용하고 계십니까? (울타리) (0) | 2020.02.18 |
[RUBY-ON-RAILS] CSRF 보호를 해제하지 않고 API 디자인 레일 (0) | 2020.02.18 |
[RUBY-ON-RAILS] 명명 된 노선 _url 대 _path (0) | 2020.02.18 |