我有三个型号:
class Question < ActiveRecord::Base
has_many :factor_questions
has_many :bigfivefactors, through: :factor_questions
accepts_nested_attributes_for :factor_questions
accepts_nested_attributes_for :bigfivefactors
end
class Bigfivefactor < ActiveRecord::Base
has_many :factor_questions
has_many :questions, through: :factor_questions
end
和我的连接表,它不仅包含bigfivefactor_id
和question_id
,还包含另一个整数列value
。
class FactorQuestion < ActiveRecord::Base
belongs_to :bigfivefactor
belongs_to :question
end
使用我的Question
_form.html.erb
可以正常使用
<%= form_for(@question) do |f| %>
<div class="field">
<%= f.label :questiontext %><br>
<%= f.text_field :questiontext %>
</div>
<%= f.collection_check_boxes :bigfivefactor_ids, Bigfivefactor.all, :id, :name do |cb| %>
<p><%= cb.check_box + cb.text %></p>
<% end %>
这让我来检查或取消选中尽可能多的bigfivefactors
。
但是,正如我之前提到的,连接模型也包含value
。
问题:
如何在每个复选框旁边添加文本字段以动态添加/编辑“值”?
For better understanding, i added an image
在控制台中,我基本上可以这样做:
q= Question.create(questiontext: "A new Question")
b5 = Bigfivefactor.create(name: "Neuroticism")
q.bigfivefactors << FactorQuestion.create(question: q, bigfivefactor: b5, value: 10)
我还发现要修改我的questions_controller
:
def new
@question = Question.new
@question.factor_questions.build
end
但我不知道如何将其纳入我的观点。
非常感谢你的帮助!
答案 0 :(得分:0)
看起来你的Bigfivefactors不应该被修改每个更新问题。我实际上假设这些将是CMS控制的字段(这样管理员就可以定义它们)。如果是这种情况,请删除问题模型中bigfivefactors的accepts_nested_attributes。这将允许param注入将改变整个网站的行为。您希望能够链接到现有的bigfivefactors,因此@question.factor_questions.first.bigfivefactor.name
是标签,@question.factor_questions.first.value
是值。请注意,这些存在于不同的平面上。对象模型,所以我们可以在这里做很多魔术。
为了传递您正在寻找的嵌套属性,参数需要如下所示:
params = {
question: {
questiontext: "What is the average air speed velocity of a sparrow?",
factor_questions_attributes: [
{ bigfivefactor_id: 1, value: 10 },
{ bigfivefactor_id: 2, value: 5 } ]
}
}
一旦我们看到这样的参数,运行Question.create(params[:question])
将创建问题和关联的@question.factor_questions
。为了创建这样的参数,我们需要html表单复选框元素,其名称为&#34; question [factor_questions_attributes] [0] [bigfivefactor_id]&#34;值为&#34; 1&#34;,然后是一个名称为&#34;问题[factor_question_attributes] [0] [value]&#34;
Api: nested_attributes_for has_many
在这里,您需要使用fields_for通过辅助字段构建嵌套属性。
<%= f.fields_for :factor_questions do |factors| %>
<%= factors.collection_check_boxes( :bigfivefactor_id, Bigfivefactor.all, :id, :name) do |cb| %>
<p><%= cb.check_box + cb.text %><%= factors.text_field :value %></p>
<% end %>
<% end %>
我不确定视图中的所有内容是如何组合在一起的。您可能无法使用内置帮助程序。您可能需要创建自己的集合助手。 @question.factor_questions
。像:
<%= f.fields_for :factor_questions do |factors| %>
<%= factors.check_box :_destroy, {checked => factors.object.persisted?}, '0','1' %> # display all existing checked boxes in form
<%= factors.label :_destroy, factors.object.bigfivefactor.name %>
<%= factors.text_box :value %>
<%= (Bigfivefactor.all - @question.bigfivefactors).each do |bff| %>
<%= factors.check_box bff.id + bff.name %><%= factors.text_field :value %></p> # add check boxes that aren't currently checked
<% end %>
<% end %>
老实说,我知道这不具备任何功能。我希望有关参数的见解有所帮助,但如果无法访问实际的rails控制台,我怀疑我是否可以创建完成您所需内容的代码。这是一个有用的链接:Site point does Complex nested queries