我是Ruby on Rails的新手。我正在尝试构建测验应用程序。一个星期我无法解决的“头痛”。
我选择/检查单选按钮并转到下一个问题,当我回到此选中的问题或重新加载页面时,已检查的问题消失了:我的意思是app没有保存我的选择。我应该使用session,饼干或什么以及如何?
index.html.erb
<% @tests.each do |test| %>
<p><h3><%= @tests.current_page %>. <%= test.question %></h3></p>
<div class="answers">
<p>
<%= collection_radio_buttons(:test, :id, [['A', test.answerA], ['B', test.answerB], ['C', test.answerC], ['D', test.answerD]], :first, :last) %>
</p>
</div>
<% end %>
tests_controller.rb
def index
@items = (1..36).to_a
@tests = Test.all.page(params[:page]).per(1)
respond_to do |format|
format.js
format.html
end
end
答案 0 :(得分:1)
我是Ruby on Rails的新手。
欢迎!!!!
您的申请存在结构性问题。
问题是您未在persistent
甚至semi-persistent
州保存任何选择。
这些是什么? Here's an explanation;基本上它意味着您能够将数据保存到文件,数据库或将其保存在内存中。对于传统应用,这可能是保持files
/ RAM
可用的形式;使用网络应用,这意味着db
和Redis
:)
我可以向您提供有关如何执行此操作的信息,但老实说,我认为您的应用程序的结构需要显着改进:
我正在尝试构建测验应用
为此,您需要遵循Rails的OOP
结构才能使用对象。然后,您将保存,添加和操作。我会在一分钟内解释。
#app/models/quiz.rb
class Quiz < ActiveRecord::Base
has_many :questions
has_many :answers, through: :questions
end
#app/models/answer.rb
class Answer < ActiveRecord::Base
#columns id | question_id | user_id | option_id | created_at | updated_at
belongs_to :question
belongs_to :user
belongs_to :option
end
#app/models/option.rb
class Option < ActiveRecord::Base
belongs_to :question
has_many :answers
end
#app/models/question.rb
class Question < ActiveRecord::Base
belongs_to :quiz
has_many :options
has_many :answers
end
这将为您提供以下容量:
#config/routes.rb
resources :quizzes, only: [:show, :index], path: "" do
resources :questions, only: [:show], path: "" do
resources :answers, only: [:new, :create] path: "", path_names: { new: "" } #->url.com/quizzes/:quiz_id/:question_id/
end
end
我没有深入探讨这个问题,虽然我觉得应该给你一些目标:
#app/controllers/answers_controller.rb
class AnswersController < ApplicationController
before_action :authenticate_user! #-> assuming you're using devise
before_action :set_data
def new
@answer = @question.answers.new
end
def create
@answer = @question.answers.new answer_params
@answer.save
end
private
def set_data
@quiz = Quiz.find params[:quiz_id]
@question = @quiz.questions.find params[:question_id]
end
def answer_params
params.require(:answer).permit(:option_id).merge(user_id: current_user.id)
end
end
这使您能够访问以下内容:
#url.com/3/6/
它会产生:
@quiz = Quiz.find "3"
@question = @quiz.questions.find "6"
@answer = @question.answers.new
您可以按以下方式填写答案:
#app/views/answers/new.html.erb
<%= form_for @answer do |f| %>
<%= f.collection_select :option, @question.options, :id, :title %>
<%= f.submit %>
<% end %>
这不会为您提供分页类型系统(尽管可以相对简单地进行调整)。它将使您能够在数据库中保存对问题的回复。
以下是:
Rails构建于 Ruby 之上,两者都继承了后者的面向对象特性。
这意味着如果您希望在应用中创建任何交互性,则需要从对象的角度考虑它,而不是UI流。
这里的不同之处在于,您不必将“测验”视为一系列页面,而是需要考虑如何构建和保存使其运行所需的各种对象。
因此,您的问题不是试图让您的特定功能正常工作,而是确保您正确构建对象。