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