Rails Devise: получить объект вошедшего в систему пользователя? - PullRequest
58 голосов
/ 11 ноября 2010

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

Ответы [ 4 ]

117 голосов
/ 11 ноября 2010

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 %>

Обновление:

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

15 голосов
/ 11 ноября 2010

Вспомогательные методы 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.

1 голос
/ 05 июля 2016

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

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"
1 голос
/ 11 ноября 2010

Передайте его как параметр для вызова метода:).

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

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

...