Rails Devise: получить объект текущего пользователя, вошедшего в систему?

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


person GSto    schedule 10.11.2010    source источник


Ответы (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?».

person Scott    schedule 10.11.2010
comment
Все, что говорит Скотт, верно, но также (и это тоже может быть новым) Devise называет здесь области видимости user и admin. Если вы видите это слово в документации, это то, к чему оно относится. - person Peeja; 09.03.2015
comment
Но где в объекте запроса эта информация? - person mehulkar; 10.05.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.

person John    schedule 11.11.2010

Передайте его в качестве параметра вызову метода :).

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

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

person Alex Bartlow    schedule 10.11.2010
comment
Лично я считаю прикрепление контекстных значений к объекту потока запахом. Вы признаете это в последней строке, так что спасибо, но я просто хочу подчеркнуть, что... - person jaydel; 29.06.2013

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

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"
person MaximuSSmile    schedule 04.07.2016