私はしばらくRails 3.2.11をハックしてきましたが、これを「正しい」方法でやろうとしています。
has_many: を通じて相互に関連する 3 つのモデル (Reflection、Skill、Utilization) があります。
利用.rb
class Utilization < ActiveRecord::Base
attr_accessible :reflection, :skill, :used_skill #used_skill is a boolean
belongs_to :reflection
belongs_to :skill
end
リフレクション.rb
class Reflection < ActiveRecord::Base
## attributes here ##
has_many :utilizations
has_many :skills, through: :utilizations
accepts_nested_attributes_for :utilizations
accepts_nested_attributes_for :skills
end
スキル.rb
class Skill < ActiveRecord::Base
## attributes here ##
has_many :utilizations
has_many :reflections, through: :utilizations
end
アプリ内では、スキルが既に定義されています。私がサポートしようとしているユーザー アクションは次のとおりです。
- ユーザーが新しい Reflection のフォームを取得します。
- ユーザーはスキルのリストを見て、どのスキルを使用したか (Utilization) をチェックします。
- ユーザーが投稿して、新しい Reflection を作成し、関連する Utilization オブジェクトを作成します。
これが新しいメソッドReflection_controller.rbです:
class ReflectionsController < ApplicationController
def new
@reflection = Reflection.new
Skill.all.each do |skill|
@reflection.utilizations.build(skill_id: skill.id, used_skill: false)
end
end
end
また、 Reflectionsの省略形の_form.html.erb
<%= form_for(@reflection) do |f| %>
<% f.fields_for :utilizations do |builder| %>
<%= builder.label :used_skill %>
<%= builder.check_box :used_skill %>
<%= builder.fields_for :skill do |skill| %>
<%= skill.label :description %>
<%= skill.text_field :description %>
<% end %>
<% end %>
<% end %>
したがって、問題は、複数の Skill があり、Utilization オブジェクトを .new して @reflection に関連付けても、フォームに表示されないことです。データ構造を少しいじってみたところ、ReflectionController.new
@reflection.utilizations に Utilization オブジェクトが含まれているところまで到達できましたが、それでも機能しません。実行する@reflection.utilizations.count
と返されます0
。id
問題は、その時点でどのオブジェクトにもないため、単にフォームにレンダリングされないことです。しかし、私の理解ではcreate
、メソッド中に異議を唱えるべきではありませんnew
…</p>
私が見逃している明らかなものはありますか?これを行うより良い方法はありますか?私は例を見てきました.Ryan BatesのRailscastを含め、人々は次のようなコードを使用しています:
def new
@survey = Survey.new
3.times do
question = @survey.questions.build
4.times { question.answers.build }
end
end
おそらくこれはうまくいきます。
本当に助かります。これを理解しようとすることは、私を夢中にさせてきました。これは SO に関する私の最初の質問です。役立つと思われる場合は、明確なデータまたは追加のコードを追加して喜んでいます。