【问题标题】:Radio button selection issue单选按钮选择问题
【发布时间】:2015-12-25 08:48:16
【问题描述】:

我是 Ruby on Rails 的新手。我正在尝试构建测验应用程序。有一个“头痛”,一个星期都解决不了。

我选择/选中单选按钮并转到下一个问题,当我回到这个选中的问题或重新加载页面时,选中的问题消失了:我的意思是应用程序没有保存我的选择。我应该使用什么会话, cookie 或什么以及如何?

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

【问题讨论】:

  • 不要使用带有bad effect 的会话或cookie。如果他们有很多用户使用该页面,它也会使您的服务器崩溃。在转到下一页之前,您应该保存。
  • 如何保存选择?我正在使用 Kaminari 进行分页。
  • 你有多少问题在一个问题轮换中。一组 10 个或更多?
  • 36 个测试块。但是会有很多不同学科的问题(数学、物理、语言等等..)
  • 所以不要保存会话的答案。在继续处理新问题之前,请尝试将它们直接保存到您的数据库中。如果不清楚,请更新您的代码。 (视图+控制器)

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


【解决方案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 流的角度考虑。 p>

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

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

【讨论】:

  • 非常感谢!我正在尝试“消化”您的想法。
  • 没问题,如果您需要澄清,我在线
猜你喜欢
  • 2017-09-05
  • 2012-12-09
  • 2014-12-08
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-12
  • 2017-09-07
相关资源
最近更新 更多