Где я могу разместить запрос текущего пользователя, чтобы он не повторялся на каждом контроллере? - PullRequest
0 голосов
/ 15 мая 2010

У меня есть стандартный запрос, который получает текущий объект пользователя:

@user = User.find_by_email(session[:email])

но я ставлю это как первую строку в каждом отдельном действии контроллера, что, очевидно, не лучший способ сделать это. Каков наилучший способ рефакторинга?

Должен ли я поместить это как метод в контроллер приложений (и если да, то можете ли вы просто показать мне быстрый пример)?

Поместить ли я весь объект @user в сеанс (имеет около 50 столбцов и некоторые чувствительные, например is_admin)?

Или есть другой способ устранения такого рода избыточности?

Ответы [ 2 ]

2 голосов
/ 15 мая 2010

Я предлагаю сделать его помощником , помещенным в модуль ApplicationHelper

def current_user
  return nil if @user === false
  #This ensures that the find method is only called once
  @user = @user || User.find_by_email(session[:email]) || false
end

Я предпочитаю вышеупомянутое использование вместо стандартного @user ||= User.find..., потому что оно предотвращает повторяющиеся запросы , если запись пользователя не найдена в первый раз. Вы также можете просто нажать метод find: find_by_email!, чтобы он вызывал исключение, когда пользователь не может быть найден

0 голосов
/ 15 мая 2010

Вы можете указать before_filter, который автоматически вызывается в начале каждого действия контроллера. Прочтите его, чтобы узнать, как его использовать.

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