0

我一直在研究 Rails 3.2.11 一段时间,并试图以“正确”的方式做到这一点。

我有三个模型(反射、技能、利用)通过 has_many: 相互关联:通过:

利用率.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. 用户获取新反射的表单。
  2. 用户会看到技能列表并检查他们使用了哪些技能(利用率)。
  3. 用户发布创建新反射并创建关联的 Utilization 对象。

这是新方法reflect_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

还有一个缩写为_form.html.erb的 Reflections

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

所以问题是,即使有多个 Skills 并且我 .new Utilization 对象并将它们与@reflection 相关联,它们也不会出现在 form 中。我已经使用了一些数据结构,我可以达到@reflection.utilizations 中包含 Utilization 对象的地步ReflectionController.new,它仍然无法工作;当我运行@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 的第一个问题,如果您认为有帮助,我很乐意添加任何澄清数据或附加代码。

4

1 回答 1

0

你忘了使用=:

  <%#### Here ####%>
  <%= f.fields_for :utilizations do |builder| %>
    <%= builder.label :used_skill %>
    <%= builder.check_box :used_skill %>
    <%#### and here ####%>
    <%= builder.fields_for :skill do |skill| %>
于 2013-07-20T04:48:32.090 回答