Проблема с Rails MVC концепции - PullRequest
0 голосов
/ 06 апреля 2011

Тьфу - не уверен, почему у меня так много проблем с этим.

Написание простого приложения для вопросов и ответов (см. Rails - Куда должен идти этот код, чтобы оставаться верным дизайну MVC? для некоторых деталей)

Попытка придерживаться принципов MVC и правильного дизайна - это приложение просто опыт обучения, поэтому я хочу убедиться, что я делаю вещи общепринятым способом

Упомянутый вопрос дал мне совет разделить мою функциональность на разные модели.Однако, пытаясь реализовать это, я обнаруживаю, что передаю параметры повсюду, и у меня просто возникает ощущение, что я что-то не так делаю правильно.Итак, вот основной макет приложения и задачи, которые я пытаюсь выполнить - если кто-то может сообщить мне, если я на правильном пути ...

Модель вопроса: содержит идентификатор (pkey),question_number (int), question_text (строка), answer_text (строка)

Модель пользователя: содержит: id (pkey), uid (строка), current_question (int), имя (строка)

Я создал оба вышеперечисленных с помощью scaffold, чтобы у них были все маршруты по умолчанию, действия контроллера и т. Д. *

Я создал контроллер шлюза и установил его в качестве моей страницы по умолчанию с помощью route.rb

Идея состоит в том, что пользователь просматривает localhost: 3000 /? Uid = "что угодно", и на странице указателя отображается текущий вопрос (Question.find_by_question_number (@ user.current_question))

Пользователь вводит ответ в форме, который помещает его в действие.В моем первом наброске это называлось действие в контроллере шлюза, которое проверяло, был ли ответ правильным.

Теперь я пытаюсь воспользоваться советом Вадима в моем последнем вопросе и сохранить логин пользователя в пользовательском и вопросе.логика под вопросом.Так что теперь моя форма отправляет сообщения в контроллер пользователей.

Вот где я запутался.Логический код не должен быть в контроллере, верно?Поэтому я вызываю метод в модели, передавая ему такие вещи, как ответ пользователя и идентификатор вопроса, поскольку я не могу прочитать сеанс в модели.Это работает нормально, теперь я могу позаботиться о логике в пользовательской модели - так что теперь пользовательская модель вызывает метод в модели вопроса, чтобы фактически проверить ответ.Это означает, что мне нужно создать экземпляр объекта моего вопроса, используя переданный мной идентификатор, а затем вызвать другой метод, передав (снова!) Ответ.И т.д ... и т.д ...

Видишь, о чем я?Я определенно понимаю ценность MVC в теории, но всякий раз, когда я пытаюсь его реализовать, я сталкиваюсь с таким беспорядком, как этот.Это правильно, и кажется, что все усложняется, потому что моя программа настолько проста?

Может кто-нибудь рассказать мне, как бы вы разбили логику?Вам не нужно публиковать реальный код, просто то, что вы бы поместили куда, например:

Контроллер шлюза: -дисплей-вопрос для пользователя -примите ответ и передайте в XXX контроллер

XXX контроллер:-call метод Foo в модели XXX, передавая X и Y

Основной поток должен быть таким: пользователь показывает вопрос, пользователь отвечает на вопрос, ответ сравнивается с правильным ответом в модели вопроса, сообщение возвращается на основеВ результате, и ответ был правильным, значение current_question пользователя увеличивается.

Большое спасибо за помощь, у меня есть книги и Google, и я прочел свои $$ off, только что потерянные в соусе.Это моя первая попытка выйти за рамки заранее написанного примера кода, поэтому будьте осторожны !!

Спасибо !!

Ответы [ 2 ]

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

В большинстве случаев в приложении вопросов и ответов у вас есть модель вопроса, модель ответа и модель пользователя. Ваши действия:

  1. отображение ответов (метод show для контроллера вопросов)
  2. Отображение новой формы ответа
  3. Публикация в методе создания на контроллере ответов.

Код:

class Question
  has_many :answers
end

class Answer
  belongs_to :question
  has_many :users
  validates_presence_of :user
  validates_presence_of :question
  validates_uniqueness_of :question_id, :scope => :user_id
end

class User
  has_many :answers
end

Маршруты

resources :questions do
  resources :answers
end

answers_controller

class AnswersController < ApplicationController

  def create
    @answer = Answer.new(params[:answer])
    @answer.user = current_user
    @answer.question = Question.find(params[:question_id])
    if @answer.save
      flash[:success] = "Saved!"
      redirect_top @answer.question
    else
      render :new
    end
  end
end
0 голосов
/ 06 апреля 2011

Основной поток должен быть:

  • метод в контроллере выбирает вопрос и отображает представление с формой в нем
  • пользователи отправляют эту форму
  • это POST для контроллера
  • в контроллере вы проверяете результат и отображаете его пользователю в другом / том же виде.

Теперь к модели. Вы можете поместить туда методы, которые проверяют определенные вещи. Тем не менее, контроллер обрабатывает работу, вызывает метод и обрабатывает результаты в контроллере.

...