Ruby on Rails如何将单选按钮选中值传递到指定控制器方法
路由配置修正
你当前请求未命中do方法的核心原因是路由表中没有对应动作的匹配规则,且do是Ruby内置关键字,不适合作为控制器动作名,建议替换为check_answer:
- 修改
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
- 修改
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
相关产品推荐
相关产品推荐

