gpt4 book ai didi

ruby-on-rails - 以随机顺序将每条记录显示为新页面

转载 作者:数据小太阳 更新时间:2023-10-29 08:12:03 26 4
gpt4 key购买 nike

过去两天我一直在试图弄清楚如何解决这个问题,但似乎找不到解决方案,所以希望有人能帮助我。

我正在制作一个具有测试功能的基本应用程序。每个测试都包含几个问题。我正在努力做到这一点,以便当用户选择要完成的测试时,系统会在新页面上随机向他们提供每个问题(他们必须选择一个答案才能继续下一个问题等)。

有什么方法可以用 .each 循环在 rails 中做到这一点?

在我当前的 test_controller.rb 中我有:

def show
@test = Test.find(params[:id])
@questions = Question.all
@question = @questions.sample(5)
end

在我的 questions_controller.rb 我有:

def show
@test = Test.find(params[:test_id])
@questions = Question.all
@question = @questions.sample(5)
# @question = Question.find(params[:id])
# @test = Test.find(params[:test_id])
end

def edit
@test.questions.find(params[:id])
end

def update
@question = Question.find(params[:id])
@question.update(params.require(:question).permit(:answer))
end

在我的 questions/show.html.erb 中我有:

<% @question.each do |question| %>
<h2>Question </h2>
<p>
<%= image_tag question.image.url(:medium) %>
</p>
<%= form_tag edit_test_question_path do %>
<%= radio_button_tag :answer, "a" %> a
<%= radio_button_tag :answer, "b" %> b
<%= radio_button_tag :answer, "c" %> c
<%= radio_button_tag :answer, "d" %> d
<br/>
<%= submit_tag 'Save', class: "btn btn-lg btn-success" %>
<% end %>
<% end %>

但是当我使用它时,它目前在一页上显示所有 5 个问题,这意味着 url 是:

http://localhost:3000/tests/2/questions/1%2F5%2F3%2F4%2F2

这显然意味着 form_tag 不起作用,因为它正试图转到 http://localhost:3000/tests/2/questions/1%2F5%2F3%2F4%2F2/edit ,这是不存在的。

有没有办法让它一次只显示一个问题并以随机顺序循环遍历所有问题?我需要能够在用户继续之前保存他们对问题的回答。

如有任何帮助,我们将不胜感激!

最佳答案

您不能为此使用each,因为您将向服务器发出新请求的每个页面,并且每个循环都必须在您提供响应之前完成。

我建议使用 wicked gem为此目的,通过一个小的调整来随机化步骤。

wicked 的工作方式是将所有逻辑都放在一个 Controller 中。通常,新操作负责通过将其 id 存储在 session 中来设置您将要处理的模型。我们会做类似的事情,但我们会随机选择一些问题并将这些 id 存储在 session 中。第二步是强制 wicked 在 session 中使用这个数组而不是硬编码步骤。

所以你的 Controller 看起来像:

class MyTest < ApplicationController

include Wicked::Wizard
before_action :set_steps, only: [:show, :update]
before_action :setup_wizard, only: [:show, :update]

def new
# Generate list of questions and store them in a session
session[:question] = Question.order('RAND()').limit(5).pluck(:id)
redirect_to action: :show
end

def show
@question = Question.find(step)
# No render_wizard here as we are using same template for all steps
end

def update
@question = Question.find(params[:id])
@question.update(params.require(:question).permit(:answer))
redirect_to next_wizard_step # you can add validations here as well
end

private

def set_steps
self.steps = session[:questions]
end

def finish_wizard_path
test_results_path # where to go hen all questions has been answered
end

结束

当然这只是顶层 View ,您可以在此处添加更多逻辑,包括末尾的测试摘要等。

使用它可以确保一旦从数据库中选择了给定的问题集,用户就无法更改这些问题。问题的 ID 将显示在 url 中,但是用户无法更改它,因为他将收到步骤未定义的错误。如果您更喜欢显示 1,2,3,4,5,这也很容易实现 - 在 session 中保留问题,但不要使用该数组来定义步骤。将通常的步骤定义为 1,2,3,4,5 并在显示和更新中使用 find(session[:questions][step.to_i - 1]) - 无限可能。

另请注意,有了这个逻辑,您可以让用户在问题之间跳转以更正他之前的答案,这非常简洁。

关于ruby-on-rails - 以随机顺序将每条记录显示为新页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28559072/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com