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

Как получить текущего пользователя с помощью devils в rails без использования аутентификации! на контроллере

Я использую devise с rails 3, и я пытаюсь создать страницу, которую могут просматривать все (даже те, кто не зарегистрирован), но имеет дополнительную функциональность для зарегистрированных людей.

Проблема заключается в том, что когда я вызываю current_user, нет пользователя, потому что я не использовал аутентификацию! фильтр на моем контроллере, потому что я хочу, чтобы незарегистрированные пользователи могли его просматривать.

Как я могу войти в пользователь, если они находятся на сеансе, оставив его без пользователя?

4b9b3361

Ответ 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?, хотя, или он сработает, когда пользователь не войдет в систему.