Как заставить текущего пользователя использовать devise в рельсах без аутентификации! на контроллере - PullRequest
18 голосов
/ 21 ноября 2010

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

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

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

Ответы [ 4 ]

14 голосов
/ 21 ноября 2010

Вы можете использовать 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 %>
1 голос
/ 14 октября 2011

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

Однако если вы создаете пользователя как 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? ).

1 голос
/ 28 июня 2011

Единственный способ, которым я могу думать, это вызывать его каждый раз, когда вы хотите позвонить текущему пользователю, что, вероятно, не лучшее решение ... так что это будет что-то вроде

if user_signed_in?
#code for current_user
else
#code for no current_user object
end
0 голосов
/ 21 января 2011

Не придираться, но кажется, что оба работают в одинаковых местах, просто current_user не инициализируется, если ни один пользователь не вошел в систему.

Вот фрагмент строки из связанной идеи, это от before_filter, который запрещает пользователям редактировать элементы, которые им не принадлежат

user_signed_in? && (@subscription.user_id == current_user.id || current_user.admin)

Вы должны обернуть весь бит с && на user_signed_in?, или он будет аварийно завершен, если ни один пользователь не вошел в систему.

...