Недавно я установил Devise в приложении rails, и мне интересно, можно ли получить экземпляр текущего пользователя, вошедшего в систему, в любой из других моделей или контроллеров, и если да, то как мне это сделать?
Rails Devise: получить объект текущего пользователя, вошедшего в систему?
Ответы (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 (например, User и Admin), вы можете использовать удобный метод «anybody_signed_in?
», чтобы проверить, вошли ли в систему пользователи любого из этих типов:
<% if anybody_signed_in? %>
<h2>Special offers</h2>
<p>All registered users will receive free monkeys!</p>
<% end %>
Обновление:
Начиная с Devise версии 1.2.0, «anybody_signed_in?
» устарело и заменено на «signed_in?
».
user
и admin
. Если вы видите это слово в документации, это то, к чему оно относится.
- person Peeja; 09.03.2015
Вспомогательные методы 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
в качестве фильтра перед_фильтром, но если вы используете стек развертывания, такой как 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"