2015-09-28 4 views
1

Я новичок в 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 
+0

Не используйте сеанс или файлы cookie, у которых есть [плохой эффект] (http://info.meteor.com/blog/session-cookies). Кроме того, это приведет к сбою вашего сервера в том, что у них много пользователей, использующих эту страницу. Прежде чем перейти к следующей странице, сохраните ее. –

+0

Как сохранить выбор? Я использую Каминари для разбивки на страницы. –

+0

Сколько вопросов у вас есть за один поворот вопроса. набор из 10 или более? –

ответ

1

Я новичок в Ruby On Rails.

Добро пожаловать !!!!


У вас возникли структурные проблемы с вашим приложением.

Проблема в том, что вы не сохраняете ни один из ваших выборов в persistent или даже semi-persistent состоянии.

Что это? Here's an explanation; в основном это означает, что вы можете сохранить свои данные в файл, базу данных или сохранить его в памяти. В традиционных приложениях это может быть в виде хранения files/RAM; с веб-приложений, это означает db и Redis :)

Я мог бы дать вам информацию о том, как это сделать, но, если честно, я думаю, что структура вашего приложения должна значительно улучшить:


Я пытаюсь построить викторины приложения

чтобы сделать это, вы должны следовать OOP структуры Rails для работы с объектом. Это то, что вы затем сохраните, добавьте и манипулируете. Я объясню через минуту.

#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 построен на вершине рубин, оба из которых наследует объекта ориентированного характера последних.

Это означает, что если вы хотите создать любой интерактивности в пределах вашего приложения, вы должны рассмотреть его с точки зрения объектов, не UI поток.

Разница заключается в том, что вместо того, чтобы думать о ваших «викторинах» как о серии страниц, вам нужно подумать о том, как вы собираетесь создавать и сохранять различные объекты, необходимые для его запуска.

Таким образом, ваш вопрос заключается не в попытке заставить вашу конкретную функциональность работать, а в том, чтобы обеспечить правильное построение объектов.

+0

Огромный Thanx! Я пытаюсь «переварить» то, что вы подумали. –

+0

Без проблем, я в сети, если вам нужно уточнение –

Смежные вопросы