Ruby on rails 如何在模型中保存选定的单选按钮值

Ruby on rails 如何在模型中保存选定的单选按钮值,ruby-on-rails,Ruby On Rails,我有一个类似Rails Survey Gem(runtimerevolution)的评估模型,老师在那里为学生创建MCQ评估。其选项为单选按钮类型。有一种选择是正确的 当学生申请MCQ评估时,它会得到一份问题纸,其中问题有多个选项,学生通过单选按钮选择一个选项 所以我只想在我的新模型尝试中存储关于问题id的所选选项 这是学生MCQ的申请页面 <div class="stream-cont"> <%= form_tag(action: "apply") do %>

我有一个类似Rails Survey Gem(runtimerevolution)的评估模型,老师在那里为学生创建MCQ评估。其选项为单选按钮类型。有一种选择是正确的

当学生申请MCQ评估时,它会得到一份问题纸,其中问题有多个选项,学生通过单选按钮选择一个选项

所以我只想在我的新模型尝试中存储关于问题id的所选选项

这是学生MCQ的申请页面

<div class="stream-cont">
    <%= form_tag(action: "apply") do %>
        <% @mcq.questions.each_with_index do |q, i| %>
            <div class="feed-cont-title all-header">
                <p>
                    <%="Question-#{i+1}: "+ q.question %>
                </p>
                <p>
                    <strong>Answer : </strong>
                    <%=
                      collection_radio_buttons("questions[#{q.id}]", :option_id, q.options, :id, :option) do |b|
                        b.label(style: "display:block") { b.radio_button + b.text }
                      end
                  %>
                </p>
            </div>
        <% end %>
    <% end %>
    <%= submit_tag "Submit Answer", :class => "typeD button" %>
</div>
这是不完整的,我知道这是不正确的。我只想知道我是如何获得关于问题id的所选选项id的,并将该值保存在尝试模型的选项id列中


我知道如何管理它,以及在视图和控制器中应该使用什么。

Mcq实际上是这里的顶级模型,而不是尝试,因此我认为嵌套造成了一些混乱

在这种情况下,您可以利用form_for和fields_for,这将为您嵌套params散列。它看起来像这样:

<%= form_for @mcq do  |f| %>
    <% f.fields_for :question |question_fields, i| %>
        <div class="feed-cont-title all-header">
            <p>
                <%="Question-#{i+1}: "+ question_fields.object %>
            </p>
            <p>
                <strong>Answer : </strong>
                   <% question_fields.fields_for :option |option_fields| %>
                       <%= option_fields.radio_button(:id) %>
                       <%= option_fields.label(:name) %>
                  <% end %>
            </p>
        </div>
    <% end %>
<% end %>
当您提交表单时,您的参数将类似

:mcq[:user_id, :id, questions_attributes[][:id, :options_attributes[:id]]
此时,您只需迭代问题属性散列以在用户上构建尝试对象


很抱歉,如果代码不到位-我不确定我是否完全理解问题和选项之间的关系,但这应该会让您沿着这条道路前进。如果太嵌套了,你可以保留单选按钮集合,我只是发现随着时间的推移,表单往往会变得复杂,所以让rails为你嵌套它们是一件很好的事情。

首先,为什么你有一个
apply
方法


铁路严重依赖基础设施;您的请求应进入
应用程序
控制器,与
应用程序
型号关联:

#app/models/application.rb
class Application < ActiveRecord::Base
    #columns id | mcq_id | user_id | created_at | updated_at
    belongs_to :mcq
    belongs_to :user
    has_many :answers, class: "ApplicationAnswer"
    accepts_nested_attributes_for :answers
end

#app/models/application_answer.rb
class ApplicationAnswer < ActiveRecord::Base
    #columns id | application_id | question_id | answer_id | created_at | updated_at
    belongs_to :application
    belongs_to :question
    belongs_to :answer
end

#app/models/mcq.rb
class MCQ < ActiveRecord::Base
    has_many :applications
    has_many :questions
    has_many :answers, through: :questions
end

#app/models/question.rb
class Question < ActiveRecord::Base
   #columns id | mcq_id | etc | etc
   belongs_to :mcq
   has_many :answers
   accepts_nested_attributes_for :answers #-> you can make a nested form; each time you make a question, you can make answers
end

#app/models/answer.rb
class Answer < ActiveRecord::Base
    #columns id | question_id | value | created_at
    belongs_to :question
end
现在,您要创建的表单能够通过
应用程序保存
应用程序应答

#app/views/applications/new.html.erb
<%= form_for @mcq.applications.new do |f| %>
   <%= f.text_field :your_mcq_stuff_here %>
   <%= f.fields_for :answers, @mcq.questions do |question| %>
      <%= question.hidden_field :question_id, question.id %>
      <%= question.collection_radio_buttons :answer_id, question.answers.all, :id, :value %>
   <%= f.submit %>
   <% end %>
<% end %>
#app/views/applications/new.html.erb
这里有几个问题包括查询问题,以及我没有测试它的事实

--

如果这项工作正常,您基本上可以让
用户
MCQ
提交
应用程序
。每个
MCQ
将有一系列
问题
,这些问题有一系列
答案


这可能需要调整;这是我将用于此类项目的结构。

是的,我使用这种方法创建Mcq并成功完成。在学生阶段,我希望捕获所选选项的id并将其存储在尝试模型中。所以我对学生成绩执行检查操作。这正是我所描述的。很抱歉,我的代码没有被剪切和粘贴,你必须自己解决这个问题。我正在使用
它通过
“尝试”=>{“尝试”选项属性”=>{“0”=>{“问题”=>“31”,“id”=>“15”},“1”=>{“问题”=>“33”,“id”=>“16”},“2”=>{“问题”=>“35”,“id”=>“17”},“提交”=>“创建尝试”}
但是
不允许的参数:问题,id
。。。。我想在Attemptoption模型的option\u id列中存储问题值…类似于我使用的方法,但我得到错误-'param丢失或值为空:trunt'在'params.require(:trunt).permit(:user\u id,:mcq\u id,questions\u attributes[:id,:option\u id])'可能与选项_id嵌套在问题属性中的方式有关。如果您像上面那样完全嵌套它们,那么问题和选项都只有:id列。
#app/models/application.rb
class Application < ActiveRecord::Base
    #columns id | mcq_id | user_id | created_at | updated_at
    belongs_to :mcq
    belongs_to :user
    has_many :answers, class: "ApplicationAnswer"
    accepts_nested_attributes_for :answers
end

#app/models/application_answer.rb
class ApplicationAnswer < ActiveRecord::Base
    #columns id | application_id | question_id | answer_id | created_at | updated_at
    belongs_to :application
    belongs_to :question
    belongs_to :answer
end

#app/models/mcq.rb
class MCQ < ActiveRecord::Base
    has_many :applications
    has_many :questions
    has_many :answers, through: :questions
end

#app/models/question.rb
class Question < ActiveRecord::Base
   #columns id | mcq_id | etc | etc
   belongs_to :mcq
   has_many :answers
   accepts_nested_attributes_for :answers #-> you can make a nested form; each time you make a question, you can make answers
end

#app/models/answer.rb
class Answer < ActiveRecord::Base
    #columns id | question_id | value | created_at
    belongs_to :question
end
#config/routes.rb
resources :mcqs, only [:show] do
   resources :applications, only: [:new, :create] #-> url.com/mcq/:id/applications/new
end

#app/controllers/applications_controller.rb
class ApplicationsController < ApplicationController
   def new
      @mcq = MCQ.find params[:id]
   end
   def create
      @mcq = MCQ.find params[:id]
      @application = @mcq.applications.new application_params
      if @application.save
         # ...
      else
         # ...
      end
   end

   private

   def application_params
      params.require(:application).permit(:application, :params, :mcq_id, answer_params: [:question_id, :application_id, :answer_id]).merge(user_id: current_user.id)
   end
end
#app/views/applications/new.html.erb
<%= form_for @mcq.applications.new do |f| %>
   <%= f.text_field :your_mcq_stuff_here %>
   <%= f.fields_for :answers, @mcq.questions do |question| %>
      <%= question.hidden_field :question_id, question.id %>
      <%= question.collection_radio_buttons :answer_id, question.answers.all, :id, :value %>
   <%= f.submit %>
   <% end %>
<% end %>