Когда код принадлежит модели в ruby ​​на рельсах? - PullRequest
2 голосов
/ 25 сентября 2011

В настоящее время я занимаюсь практикой 3-х рельсов, и я работал над системой аутентификации и следовал учебному пособию по Railscasts. Райан из Railscasts сделал своего рода обновление к этому уроку с некоторыми незначительными изменениями, чтобы воспользоваться преимуществами рельсов 3.1

например. has_secure_password

Так что часть кода в моем Sessions_controller изменилась на:

class SessionsController < ApplicationController
  def new
  end

  def create
    user = User.find_by_username(params[:username])
    if user && user.authenticate(params[:password])
      session[:user_id] = user.id
      redirect_to root_path, :notice => "Logged In"
    else
      flash.now.alert = "Invalid Credentials"
      render "new"
    end
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_path, :notice =>"Logged Out"
  end

end

Что я хотел бы знать, так это то, что часть кода в методе / действии создания должна быть в модели? Хорошо или плохо иметь этот код там?

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

Совет ценится ..

Что я хотел бы знать, в частности, это ..
1. Когда программист узнает, когда код принадлежит модели? Как он / она принимает это решение?

Ответы [ 2 ]

3 голосов
/ 25 сентября 2011

Это один из самых важных вопросов в ОО-программировании.

Все дело в обязанностях.Поместите код в вашу модель, если вы считаете, что модель отвечает за эту функциональность.

В вашем примере вы видите, что:

  • SessionController отвечает только за создание и уничтожениесеанс пользователя.
  • За аутентификацию отвечает User.

Вся бизнес-логика входит в ваши модели.Ваши контроллеры заботятся о заполнении ваших представлений, обработке ввода пользователя и отправке пользователя в пути.Просмотр просто отображать информацию, почти не содержать никакой логики (если есть).

Также: взгляните на существующие проекты для вдохновения (например, Shopify ).

0 голосов
/ 25 сентября 2011

Мой совет:

В модели пользователя (псевдокод):

function authenticate(username, pass) {
  /*get user by name
  return user_id (or user object if you need some user data in view) if auth ok,   otherwise false
  */
}

Я думаю, вы всегда должны держать контроллеры как можно меньше. Наиболее важной идеей в ООП является инкапсуляция, поэтому вы должны записывать все операции над пользователем в пользовательском классе, возвращать клиентскому коду (в данном случае контроллеру) только то, что контроллеру нужно для его работы - добавьте идентификатор пользователя в сеанс.

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