我一直在研究 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
在应用程序中,技能已经定义。我试图支持的用户操作是:
- 用户获取新反射的表单。
- 用户会看到技能列表并检查他们使用了哪些技能(利用率)。
- 用户发布创建新反射并创建关联的 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 的第一个问题,如果您认为有帮助,我很乐意添加任何澄清数据或附加代码。