私はdeviseをRails 3で使用しており、誰でも(サインアップしていない人でも)表示できるが、登録されている人のための追加機能を備えたページを作成しようとしています。
問題は、現在のユーザーを呼び出すと、認証を使用していないためにユーザーがいないことです。未登録のユーザーがコントローラーを表示できるようにしたいので、コントローラーでフィルターをかけます。
ユーザーがセッションに参加している場合、それ以外の場合はユーザーなしでユーザーをサインインするにはどうすればよいですか?
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 %>
簡単なメモ。管理者ユーザーがログインしているかどうかを確認したかったので、ログインしている場合は、パブリックビューページに役立つリンクと情報を提供して、管理者が管理セクションにすばやくジャンプしてリソースを編集できるようにしました。
ただしユーザーをAdminUserとして生成する場合(ActiveAdminの開始手順に従って)、メソッドser_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でusersを設定したときに使用したものに基づいて、メソッド名が生成されることを期待しています(userモデルVipの場合、メソッドはvip_signed_in?)になります。
これを行うために私が考えることができる唯一の方法は、現在のユーザーに電話をかけるたびに電話をかけることです。これはおそらく最善の解決策ではありません...したがって、次のようになります。
if user_signed_in?
#code for current_user
else
#code for no current_user object
end
気を悪くする必要はありませんが、どちらも同じ場所で機能しているようです。ユーザーがサインインしていない場合、current_user
が初期化されないだけです。
これは、関連するアイデアの一部です。これは、ユーザーが自分に属していないアイテムを編集することを禁止するbefore_filter
からのものです。
user_signed_in? && (@subscription.user_id == current_user.id || current_user.admin)
ただし、&&
ではビット全体をuser_signed_in?
でラップする必要があります。そうしないと、ユーザーがサインインしていないときにクラッシュします。