首页 > 解决方案 > 将数据从单选按钮发送到控制器以验证 Rails 中的嵌套属性值

问题描述

我需要radio button将从html页面中选择的值发送到controller. 我有一个与模型Questionhas_many关系的Option模型。我现在的做法是这样的:

html.erb

<p>
  <strong>Body:</strong>
  <%= @question.body %>
</p>

<p>
  <strong>Option:</strong>
  <% @question.options.each do |p| %>
    <%= radio_button_tag('option',p.is_answer) %>
    <%= p.body %>       
  <% end %>
</p>
<p><%= link_to 'Check Answer', check_answer_question_path(@question) %></p>
<p>
  <strong>User:</strong>
  <%= @question.user.email %>
</p>

楷模

class Question < ApplicationRecord
  belongs_to :user
  has_many :options, dependent: :delete_all, :autosave => true
  serialize :options
  validates_length_of :options, maximum: 4

  accepts_nested_attributes_for :options
end
class Option < ApplicationRecord
  belongs_to :question
  validates_associated :question
end

控制器

def check_answer
  bool_value = p.is_answer
  if(p.is_answer == true)
    do something
  else
    do something else
  end
end

private
    def set_question
      @question = Question.find(params[:id])
    end   

    def question_params
      params.require(:question).permit(:body, options_attributes: [:id, :body, :question_id, :created_at, :updated_at, :is_answer])
    end

如何在控制器中获取p.is_answer选择单选按钮并单击按钮时的值Check Answer

标签: ruby-on-rails

解决方案


  1. 在您的代码段中,“检查答案”只是一个链接。由于您希望在单击它时发送多个属性,因此您可能希望提交一个表单。
  2. 第二个参数radio_button_tag是您的控制器将在参数中接收的值。取而代之的是p.is_answer,您可能想要拥有p.id.

表格文件

单选按钮的文档

PS 关于为什么您应该发送选项的 id:我不确定您的业务用例是什么,但是如果您想确定用户选择了哪个选项,您想发送一个选项标识符,即选项的标识符id。此外,用户可以在不知道哪个选项正确的情况下发送此参数。如果这是学校考试,那么学生可能会作弊:)


推荐阅读