web-dev-qa-db-ja.com

コントローラで認証を使用せずにRails)でdeviseを使用して現在のユーザーを取得する方法

私はdeviseをRails 3で使用しており、誰でも(サインアップしていない人でも)表示できるが、登録されている人のための追加機能を備えたページを作成しようとしています。

問題は、現在のユーザーを呼び出すと、認証を使用していないためにユーザーがいないことです。未登録のユーザーがコントローラーを表示できるようにしたいので、コントローラーでフィルターをかけます。

ユーザーがセッションに参加している場合、それ以外の場合はユーザーなしでユーザーをサインインするにはどうすればよいですか?

18
Paul Johnson

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 %>
14
Chandra Patni

簡単なメモ。管理者ユーザーがログインしているかどうかを確認したかったので、ログインしている場合は、パブリックビューページに役立つリンクと情報を提供して、管理者が管理セクションにすばやくジャンプしてリソースを編集できるようにしました。

ただしユーザーをAdminUserとして生成する場合(ActiveAdminの開始手順に従って)、メソッドser_signed_in?およびcurrent_useradmin_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でusersを設定したときに使用したものに基づいて、メソッド名が生成されることを期待しています(userモデルVipの場合、メソッドはvip_signed_in?)になります。

1
codesponge

これを行うために私が考えることができる唯一の方法は、現在のユーザーに電話をかけるたびに電話をかけることです。これはおそらく最善の解決策ではありません...したがって、次のようになります。

if user_signed_in?
#code for current_user
else
#code for no current_user object
end
1
Travis Pessetto

気を悪くする必要はありませんが、どちらも同じ場所で機能しているようです。ユーザーがサインインしていない場合、current_userが初期化されないだけです。

これは、関連するアイデアの一部です。これは、ユーザーが自分に属していないアイテムを編集することを禁止するbefore_filterからのものです。

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

ただし、&&ではビット全体をuser_signed_in?でラップする必要があります。そうしないと、ユーザーがサインインしていないときにクラッシュします。

0
Katy Levinson