单选按钮选择问题

时间:2015-09-28 07:09:18

标签: ruby-on-rails session cookies radio-button

我是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

1 个答案:

答案 0 :(得分:1)

  

我是Ruby on Rails的新手。

欢迎!!!!

您的申请存在结构性问题。

问题是您未在persistent甚至semi-persistent州保存任何选择。

这些是什么? Here's an explanation;基本上它意味着您能够数据保存到文件,数据库或将其保存在内存中。对于传统应用,这可能是保持files / RAM可用的形式;使用网络应用,这意味着dbRedis:)

我可以向您提供有关如何执行此操作的信息,但老实说,我认为您的应用程序的结构需要显着改进:

  

我正在尝试构建测验应用

为此,您需要遵循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 %>

这不会为您提供分页类型系统(尽管可以相对简单地进行调整)。它使您能够在数据库中保存对问题的回复。

以下是:

enter image description here

Rails构建于 Ruby 之上,两者都继承了后者的面向对象特性。

这意味着如果您希望在应用中创建任何交互性,则需要从对象的角度考虑它,而不是UI流。

这里的不同之处在于,您不必将“测验”视为一系列页面,而是需要考虑如何构建和保存使其运行所需的各种对象。

因此,您的问题不是试图让您的特定功能正常工作,而是确保您正确构建对象。