0

私はしばらく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

アプリ内では、スキルが既に定義されています。私がサポートしようとしているユーザー アクションは次のとおりです。

  1. ユーザーが新しい Reflection のフォームを取得します。
  2. ユーザーはスキルのリストを見て、どのスキルを使用したか (Utilization) をチェックします。
  3. ユーザーが投稿して、新しい 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と返されます0id問題は、その時点でどのオブジェクトにもないため、単にフォームにレンダリングされないことです。しかし、私の理解では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 に関する私の最初の質問です。役立つと思われる場合は、明確なデータまたは追加のコードを追加して喜んでいます。

4

1 に答える 1