Как получить текущего пользователя с помощью devils в rails без использования аутентификации! на контроллере
Я использую devise с rails 3, и я пытаюсь создать страницу, которую могут просматривать все (даже те, кто не зарегистрирован), но имеет дополнительную функциональность для зарегистрированных людей.
Проблема заключается в том, что когда я вызываю current_user, нет пользователя, потому что я не использовал аутентификацию! фильтр на моем контроллере, потому что я хочу, чтобы незарегистрированные пользователи могли его просматривать.
Как я могу войти в пользователь, если они находятся на сеансе, оставив его без пользователя?
Ответы
Ответ 1
Вы можете использовать user_signed_in?
для добавления дополнительных функций в представления.
<% if user_signed_in? %>
... for logged in users only and current_user is not nil here....
<% else %>
... for anonymous users only and current_user is nil here....
<% end %>
Ответ 2
Единственный способ, которым я могу это сделать, - называть его каждый раз, когда вы хотите вызвать текущего пользователя, что, вероятно, не лучшее решение...
так что это будет что-то вроде
if user_signed_in?
#code for current_user
else
#code for no current_user object
end
Ответ 3
Просто быстро. Я хотел узнать, был ли зарегистрирован пользователь admin, и если да, то предоставим некоторые полезные ссылки и информацию на странице общего доступа, чтобы администратор мог быстро перейти к разделу администрирования, чтобы отредактировать ресурс.
Однако, если вы создаете своего пользователя как AdminUser (следуя инструкциям для начала ActiveAdmin), тогда методы user_signed_in? и current_user будут admin_user_signed_in? и current_admin_user.
Так, например, в публичном представлении, чтобы показать сообщение (views/posts/show.html.erb), я могу использовать (упрощен для ясности)
<div id='show_post_<%= @post.id %>'>
<h2><%= @post.title %></h2>
<div class='post_author'>by: <%= @post.author%></div>
<% if admin_user_signed_in? %>
<div class='admin_links'>Put links to admin pages for:
<%= current_admin_user.email %>
</div>
<% end %>
<div class='post_body'>
<%= raw @post.content %>
</div>
</div>
Я ожидаю, что имена методов будут сгенерированы на основе того, что вы использовали при настройке своих пользователей в ActiveAdmin или Devise (если вы назвали свою модель пользователя Vip, тогда метод будет vip_signed_in?)..
Ответ 4
Не для nitpick, но похоже, что оба работают в одних и тех же местах, просто current_user
не инициализируется, если пользователь не зарегистрирован.
Вот фрагмент строки из связанной идеи, она из before_filter
, которая запрещает пользователям редактировать элементы, которые не принадлежат им
user_signed_in? && (@subscription.user_id == current_user.id || current_user.admin)
Вы должны обернуть весь бит с помощью &&
on user_signed_in?
, хотя, или он сработает, когда пользователь не войдет в систему.