Rails Devise: получить объект текущего зарегистрированного пользователя?
Я недавно установил Devise на приложение rails, и мне интересно, можно ли получить экземпляр текущего зарегистрированного пользователя в любой из других моделей или контроллеров, и если да, то как это сделать?
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"