Я новичок в Rails и прорабатываю пару книг, кодирую небольшие тестовые проекты на ходу. Мое последнее приложение для разработчиков - это программа вопросов и ответов. Идея состоит в том, чтобы иметь таблицу базы данных, полную вопросов. Пользователь откроет веб-приложение и получит первый вопрос. Пользователь вводит ответ в форму, и если он правильный, он получает следующий вопрос. Довольно просто.
Итак, я использовал команду Scaffold для создания таблицы вопросов и таблицы пользователей. Это хорошо работает - я могу перейти к системным представлениям, чтобы добавлять / редактировать / удалять вопросы и пользователей.
Затем я создал новый контроллер с именем gateway. Я сделал это моим корневым контроллером и дал ему метод индекса. Метод index принимает идентификатор пользователя в качестве параметра URL и выбирает соответствующий вопрос для пользователя. Затем он загружает представление, которое отображает вопрос и имеет форму, в которой пользователь вводит ответ.
Я сейчас программирую логику для проверки ответа - я делал это в новом методе «test_answer» в контроллере шлюза, но я чувствую, что сейчас нарушаю дизайн MVC, так как этот код не является прямым связанные с отображением представления. Я немного сбит с толку относительно того, куда я должен поместить код, подобный этому (метод проверяет ответ, если правильный увеличивает уровень пользователя, если неправильный перенаправляет на страницу ошибки)
Должно ли оно идти в существующей модели (пользователь или вопрос)? Должен ли он оставаться в контроллере шлюза? Должен ли я создать новый файл в / lib?
Я получил общую концепцию MVC (представления отображают информацию, модели хранят и манипулируют данными, контроллеры обрабатывают взаимодействия между ними), но я не уверен, как этот код подходит.
Спасибо!
Для справки, вот мой текущий контроллер gateway.rb - пожалуйста, выберите его отдельно! Я уверен, что там есть много сомнительных битов ...
class GatewayController < ApplicationController
def index
if params[:uid]
@user = User.where(:uid => params[:uid]).first
else
@user = User.where(:uid => "000").first
end
@question = Question.where(:question_number => @user.current_level).first
session[:uid] = @user.uid
session[:answer] = @question.answer_text
end
# POST /gateway/answer
# POST /gateway/answer.xml
def answer
#below is code I feel shouldn't be here...the logic to test the answer and then increment user's level
if (params[:user_answer]) == session[:answer]
@user = User.where(:uid => session[:uid]).first
@user.increment!(:current_level)
respond_to do |format|
#code here will redirect to "Correct answer" page
end
else
respond_to do |format|
#code here will redirect to "Wrong answer" page
end
end
end
end