Я новичок в 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 %>
Это не даст вам систему постраничного типа (хотя которые могут быть адаптированы относительно просто). Он будет даст вам возможность сохранять ответы на ваши вопросы в базе данных.
Вот как:
Rails построен на вершине рубин, оба из которых наследует объекта ориентированного характера последних.
Это означает, что если вы хотите создать любой интерактивности в пределах вашего приложения, вы должны рассмотреть его с точки зрения объектов, не UI поток.
Разница заключается в том, что вместо того, чтобы думать о ваших «викторинах» как о серии страниц, вам нужно подумать о том, как вы собираетесь создавать и сохранять различные объекты, необходимые для его запуска.
Таким образом, ваш вопрос заключается не в попытке заставить вашу конкретную функциональность работать, а в том, чтобы обеспечить правильное построение объектов.
Не используйте сеанс или файлы cookie, у которых есть [плохой эффект] (http://info.meteor.com/blog/session-cookies). Кроме того, это приведет к сбою вашего сервера в том, что у них много пользователей, использующих эту страницу. Прежде чем перейти к следующей странице, сохраните ее. –
Как сохранить выбор? Я использую Каминари для разбивки на страницы. –
Сколько вопросов у вас есть за один поворот вопроса. набор из 10 или более? –