Ruby VersionL 2.0
Rails版本:4.0
我无法绕过我认为应该是一个容易出问题的问题。
我有两个控制器:Quizes
和Questions
我想要关联。为此,我创建了一个模型:assignment
。
quiz.rb
class Quiz < ActiveRecord::Base
has_many :assignments
has_many :questions, :through => :assignments
end
question.rb
class Question < ActiveRecord::Base
has_many :assignments
has_many :quizzes, :through => :assignments
has_many :answers, :dependent => :destroy
accepts_nested_attributes_for :answers, :allow_destroy => true
end
assignment.rb
class Assignment < ActiveRecord::Base
belongs_to :question
belongs_to :quiz
end
分配迁移
class CreateAssignments < ActiveRecord::Migration
def up
create_table :assignments do |t|
t.integer :quiz_id
t.integer :question_id
t.timestamps
end
add_index :assignments, :quiz_id
add_index :assignments, :question_id
end
def down
drop_table :assignments
end
end
我对此很陌生,但我认为我正确地遵循了the documentation。我现在的问题是,我如何让用户真正做到这一点。我希望用户在创建或编辑测验时能够看到所有问题的列表,并且能够为他们想要与测验关联的每个问题选中一个框。这有可能吗?
更新1 (到目前为止我有什么)
/views/quizzes/_form.html.erb
<%= form_for(@quiz) do |f| %>
<% if @quiz.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@quiz.errors.count, "error") %> prohibited this quiz from being saved:</h2>
<ul>
<% @quiz.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :text %><br>
<%= f.text_area :text %>
</div>
<%= fields_for :questions do |quiz_question| %>
<% @questions.each do |question| %>
<%= quiz_question.label question.text %>
<%= check_box_tag :question, question.id %><br>
<% end %>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
答案 0 :(得分:0)
我希望用户在创建或编辑测验时能够看到所有问题的列表,并且能够为他们想要与测验关联的每个问题选中一个框。这可能吗?
这是可能的,只需要决定你想要显示什么问题(以及已经与现有测验相关的问题,即(编辑时),似乎你想要建议弹出的问题尚未关联。特别是在新创建的测验没有关联的情况下)。然后,简单地在数据库中创建一个相应的Assignment
对象。
答案 1 :(得分:0)
这很容易。您可以通过几个步骤实现此功能。
在@questions
中的new
和edit
行动中分配QuizzesController
变量。
在测验表单中将这些问题显示为复选框:
<%= form_for(@quiz) do |f| %>
# rest of the code...
<% @questions.each do |question| %>
<p>
<%= check_box_tag 'quiz[question_ids][]', question.id,
@quiz.questions.include?(question) %>
<%= question.name # or whatever the property is %>
</p>
<% end %>
<% end %>
允许question_ids
中的QuizzesController
个参数:
def quiz_params
params.require(:quiz).permit(question_ids: [], # rest of the permitted params)
end
多数人。