18

我正在使用带有 rails 3 的设计,我正在尝试创建一个页面,每个人都可以查看(即使是那些未注册的人),但对注册的人有额外的功能。

问题是当我调用 current_user 时没有用户,因为我没有使用身份验证!在我的控制器上过滤,因为我希望未注册的用户能够查看它。

如果他们在会话中,我如何登录用户,否则在没有用户的情况下离开它?

4

4 回答 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 %>
于 2010-11-21T00:04:19.393 回答
1

我能想到的唯一方法是每次你想调用当前用户时调用它,这可能不是最好的解决方案......所以它会像

if user_signed_in?
#code for current_user
else
#code for no current_user object
end
于 2011-06-28T17:40:33.950 回答
1

只是一个简短的说明。我想知道管理员用户是否已登录,如果是,请在公共视图页面上提供一些有用的链接和信息,以便管理员可以快速跳转到管理部分来编辑资源。

但是,如果您将用户生成为 AdminUser(按照 ActiveAdmin 的入门说明),那么方法user_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 中设置用户时使用的任何内容生成(如果您将用户模型命名为 Vip 那么该方法将是vip_signed_in?)。

于 2011-10-14T14:25:53.323 回答
0

不要吹毛求疵,但似乎两者都在同一个地方工作,只是current_user如果没有用户登录,它就不会被初始化。

这是来自相关想法的一行代码,它来自before_filter禁止用户编辑不属于他们的项目

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

你必须用一个&&on包裹整个位user_signed_in?,否则当没有用户登录时它会崩溃。

于 2011-01-21T19:21:33.550 回答