Rails Devise: получить объект текущего зарегистрированного пользователя?


Я недавно установил Devise на приложение rails, и мне интересно, можно ли получить экземпляр текущего зарегистрированного пользователя в любой из других моделей или контроллеров, и если да, то как это сделать?

4 54

4 ответа:

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

следует отметить, что сгенерированное имя метода включает имя класса модели пользователя. например, если ваша модель Devise называется'User 'тогда текущий зарегистрированный пользователь может быть доступен с помощью'current_user', и если ваш класс Devise'Admin затем пользователя, вошедшего в систему администрирования можно ознакомиться с 'current_admin'.

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

эти методы доступны в контроллерах и представлениях, поэтому в представлении может быть следующее:

<% if user_signed_in? %>
  <div>Signed in as... <%= current_user.email %></div>
<% end %>

наконец, если вы используете две или более моделей Devise в своем приложении (например, пользователь и администратор), вы можете использовать 'anybody_signed_in?' удобный метод, чтобы проверить, если любой из этих типов пользователей подписаны в:

<% if anybody_signed_in? %>
  <h2>Special offers</h2>
  <p>All registered users will receive free monkeys!</p>
<% end %>

обновление:

начиная с версии 1.2.0,'anybody_signed_in? 'устарел и заменен на'signed_in?'

вспомогательные методы Devise доступны только на уровнях контроллера и представления. Они недоступны на уровне модели (см. раздел Фильтры и помощники контроллера README).

  • Is it possible to get the currently logged in user from within a model?.

это невозможно с помощью вспомогательных методов по умолчанию, которые Devise создает для вас. Тем не менее, есть много альтернативных методов, которые можно использовать для обеспечения current_user модели. Самый простой способ уже был предложен Алекс Бартлоу, и это просто передать current_user через метод для вашей модели.

  • Is it possible to get the currently logged in user from within a controllers?

Да, это возможно. Используйте current_<modelname>, где <modelname> - это имя модели, которая имеет возможности аутентификации Devise (т. е. через rails g devise <modelname>). Если, например, ваша модель User, то вы должны использовать current_user. Если ваша модель Elmo, то вы должны использовать current_elmo.

передать его в качестве параметра для вызова метода :).

одна идея заключается в использовании Thread.current[:current_user] = @current_user Как before_filter-но если вы используете стек развертывания, такой как Thin + EM_Mysql2 + Rack:: FiberPool, вам нужно будет установить это в Fiber.current[:current_user].

эти решения на самом деле просто покрывают отсутствие хорошей логики дизайна.

простой метод:

if @suit.user == current_user

пример:

= link_to "Back", root_path, class: "btn btn-default"

  -if @suit.user == current_user

    = link_to "Edit", edit_suit_path, class: "btn btn-default"

    = link_to "Delete", suit_path, method: :delete, data: {confirm: "Are you sure?" }, class: "btn btn-default"