Как заставить текущего пользователя использовать devise в рельсах без аутентификации! на контроллере
Я использую devise с rails 3 и пытаюсь создать страницу, которую могут просматривать все (даже те, кто не зарегистрировался), но имеет дополнительные функциональные возможности для людей, которые зарегистрированы.
Проблема в том, что когда я вызываю current_user, пользователя нет, потому что я не использовал аутентификацию! фильтр на моем контроллере, потому что я хочу, чтобы незарегистрированные пользователи могли просматривать его.
Как мне войти в систему, если пользователь находится в сеансе, в противном случае он останется без пользователя?
4 ответа
Ты можешь использовать 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 %>
Единственный способ, которым я могу думать, это вызывать его каждый раз, когда вы хотите позвонить текущему пользователю, что, вероятно, не лучшее решение... так что это будет что-то вроде
if user_signed_in?
#code for current_user
else
#code for no current_user object
end
Просто быстрая заметка. Я хотел выяснить, вошел ли пользователь с правами администратора, и если да, предоставить некоторые полезные ссылки и информацию на общедоступной странице, чтобы администратор мог быстро перейти к разделу администратора для редактирования ресурса.
Однако, если вы создадите своего пользователя как 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?).
Не придираться, но кажется, что оба работают в одном и том же месте, просто current_user
не инициализируется, если ни один пользователь не вошел в систему.
Вот кусок строки из связанной идеи, это от before_filter
который запрещает пользователям редактировать элементы, которые им не принадлежат
user_signed_in? && (@subscription.user_id == current_user.id || current_user.admin)
Вы должны обернуть все это &&
на user_signed_in?
хотя или произойдет сбой, когда ни один пользователь не вошел в систему.