Управление условным redirect_to в Rails - PullRequest
0 голосов
/ 25 июня 2010

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

#controller
@project = Project.find(params[:id])
if current_user.user_type == "Company"
  redirect_to :controller => "companies", :action => "home"
elsif current_user.user_type == "Contractor"
  @contractor = Contractor.find(current_user.user_type_id)
  redirect_to :controller => "contractors", :action => "home"
elsif current_user.user_type == "Customer"
  redirect_to :controller => "companies", :action => "list"
end

Это мой первый проект на Rails, и я уверен, что это плохой дизайн.Каковы простые чистые способы сделать это лучше?

Ответы [ 3 ]

2 голосов
/ 25 июня 2010

Если у вас много кода, подобного этому, это запах кода, который ваш контроллер действительно выполняет несколько целей. Предполагая, что ваш контроллер является чем-то вроде InfoController, который представляет собой REST-представление для некоторой модели Info, спросите себя:

  • Что является центральной частью ваших действий, данных или пользователя, который имеет доступ это?

  • Принимаете ли вы решения на основе того, кто запрашивает действия? (Как сохранение, удаление и т. д.)

  • Могут ли эти решения быть приняты в Информационная модель, а не в контроллере?

Мне кажется, что вы должны создавать разные контроллеры для каждой модели и делать только одно перенаправление на действие. По вашему мнению, вы можете использовать такие вещи, как polymorphic_paths для связи с вашими контроллерами.

Если вы решите не делать этого, я просто поместил бы этот код в оператор case вместо if.

0 голосов
/ 21 апреля 2012

Также можно использовать ограничения, как показано здесь: Ориентированная на пользователя маршрутизация в Rails 3

root :to => "companies#home", :constraints => UserTypeConstraint.new("Company")

Или маршруты с областью видимости, как показано здесь: Использование лямбда-выражений для Rails 3 Ограничения маршрута

scope :constraints => lambda{|req| !req.session[:company_user_id].blank? } do
  # all company routes
end
0 голосов
/ 25 июня 2010

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

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