Rails - Куда должен идти этот код, чтобы оставаться верным дизайну MVC? - PullRequest
0 голосов
/ 05 апреля 2011

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

1 Ответ

1 голос
/ 05 апреля 2011

Я бы поместил этот test_answer в вашу модель, потому что он касается данных. Это вернет логическое значение, в котором контроллер будет сравнивать, чтобы определить, следует ли перенаправить на страницу ошибки.

Полупсевдокод:

class Question
  def test_answer(arg)
    if answer_is_right
      user.incr_level
    else
      false
    end
  end
end

class GatewayController < ApplicationController
  #code

  def answer
    if !question.test_answer(param)
      redirect_to error_page_path
    end

  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...