如何为多对多关系嵌入关联模型表单

时间:2013-08-29 22:15:10

标签: ruby-on-rails

Ruby VersionL 2.0

Rails版本:4.0

我无法绕过我认为应该是一个容易出问题的问题。

我有两个控制器:QuizesQuestions我想要关联。为此,我创建了一个模型: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 %>

2 个答案:

答案 0 :(得分:0)

  

我希望用户在创建或编辑测验时能够看到所有问题的列表,并且能够为他们想要与测验关联的每个问题选中一个框。这可能吗?

这是可能的,只需要决定你想要显示什么问题(以及已经与现有测验相关的问题,即(编辑时),似乎你想要建议弹出的问题尚未关联。特别是在新创建的测验没有关联的情况下)。然后,简单地在数据库中创建一个相应的Assignment对象。

答案 1 :(得分:0)

这很容易。您可以通过几个步骤实现此功能。

@questions中的newedit行动中分配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

多数人。