Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Однако следует отметить, что имя сгенерированного метода включает имя класса вашей модели пользователя. например если ваша модель Devise называется "User", то к текущему зарегистрированному пользователю можно получить доступ с помощью "current_user", и если ваш класс Devise "Admin", доступ к зарегистрированному пользователю 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 %>

Update:

Так как Devise версии 1.2.0, 'anybody_signed_in?' устарел и заменен на 'signed_in?'

Ответ 2

Методы помощника 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> - это имя модели, у которой есть возможности проверки подлинности (т.е. Через rails g devise <modelname>). Если, например, ваша модель User, вы должны использовать current_user. Если ваша модель Elmo, вы можете использовать current_elmo.

Ответ 3

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

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

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

Ответ 4

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

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"