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

18

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

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

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

    
задан Paul Johnson 21.11.2010 в 00:56
источник
  • Если этот вопрос все еще активен, Devise теперь всегда загружает current_user для вас независимо от использования authenticate_user! перед фильтром или нет. –  zykadelic 26.10.2012 в 18:04

4 ответа

14

Вы можете использовать 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 %>
    
ответ дан Chandra Patni 21.11.2010 в 01:04
  • Да, кроме, user_signed_in? может быть true, а current_user может быть nil. Я хочу сделать, чтобы он загружал объект current_user, если кто-то вошел в систему, но нет, если это не так, и не требует, чтобы пользователь был аутентифицирован. –  Paul Johnson 21.11.2010 в 06:56
1

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

if user_signed_in?
#code for current_user
else
#code for no current_user object
end
    
ответ дан Travis Pessetto 28.06.2011 в 19:40
1

Просто быстро. Я хотел узнать, был ли зарегистрирован пользователь admin, и если да, то предоставим некоторые полезные ссылки и amp; info на странице общего доступа, поэтому администратор может быстро перейти к разделу администрирования, чтобы отредактировать ресурс.

Однако , если вы создаете своего пользователя как AdminUser (следуя инструкциям для начала ActiveAdmin), тогда методы user_signed_in? и current_user будут < strong> 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 (если вы назвали модель user Vip, тогда метод будет vip_signed_in? ).

    
ответ дан codesponge 14.10.2011 в 16:25
  • спасибо за это .. –  baash05 11.01.2012 в 03:46
0

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

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

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

Вы должны обернуть весь бит && on user_signed_in? , хотя, или он сработает, когда ни один пользователь не выполнит вход.

    
ответ дан Katy Levinson 21.01.2011 в 20:21