You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby on Rails如何将单选按钮选中值传递到指定控制器方法

路由配置修正

你当前请求未命中do方法的核心原因是路由表中没有对应动作的匹配规则,且do是Ruby内置关键字,不适合作为控制器动作名,建议替换为check_answer:

  1. 修改routes.rb,新增提交答案的POST路由:
Rails.application.routes.draw do
  root to: 'home_page#index' 
  
  get 'show_url/:id', to: 'quiz#show'
  # 优化show路由的参数规范
  get    '/show/:id', to: 'quiz#show'
  get    '/quiz',  to: 'quiz#index'
  # 新增答案校验路由
  post   '/quiz/check_answer', to: 'quiz#check_answer'
end
  1. 修改quiz_controller.rb,将原do方法重命名为check_answer,补充业务逻辑:
class QuizController < ApplicationController
  def show
    # 配合优化后的路由,用params[:id]取题目ID,更规范
    @questions = Question.find(params[:id])
  end

  def show_url
    redirect_back(fallback_location: root_path)
  end

  def index
    @questions = Question.all
    Question.logic
  end

  def check_answer
    # 获取提交的参数
    current_question = Question.find(params[:question_id])
    user_selected = params[:selected_answer]
    # 此处假设Question模型有correct_answer字段存储正确选项的键,和单选框value对应
    is_correct = (user_selected == current_question.correct_answer)
    # 可根据需求返回JSON或跳转页面,此处以同步跳转为例
    if is_correct
      flash[:notice] = "回答正确"
    else
      flash[:alert] = "回答错误"
    end
    redirect_to quiz_path
  end
private
end

视图层调整

建议替换原来的link_to_remote写法,用Rails标准的表单提交,保证参数能正确传递,修改show.html.erb代码:

<h1>Questions</h1>
<%= @questions.question %>

<div class="container mt-sm-5 my-1">
  <div class="question ml-sm-5 pl-sm-5 pt-2">
    <div class="py-2 h5"><b></b></div>
    <%= form_with url: quiz_check_answer_path, method: :post, local: true do |f| %>
      <!-- 传递当前题目ID给控制器 -->
      <%= hidden_field_tag :question_id, @questions.id %>
      <div class="ml-md-3 ml-sm-3 pl-md-5 pt-sm-0 pt-3" id="options"> 
        <% str = @questions.answers.to_s %>
        <% pairs = str.split(',').map { |pair| pair.split('=>') }%>
        <% pairs.each do |sub_array| %>
          <label class="options"> <%= sub_array[1] if sub_array[1] != "nil" %>
            <input type="radio" name="selected_answer" value="<%= sub_array[0] if sub_array[0] != "nil" %>" required> 
            <span class="checkmark"></span> 
          </label> 
        <% end %>
      </div>
      <div class="d-flex align-items-center pt-3">
        <%= f.submit 'Submit now', class: 'btn btn-success' %>
      </div>
    <% end %>
  </div>
</div>

可选调整(index页面跳转)

配合优化后的show路由,修改index.html.erb的跳转链接:

<td><%= link_to 'Question', show_path(q.id), method: :get %></td>

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 09:06:03