RoR:如何在不登录的情况下让人们看到用户链接?

时间:2012-08-06 22:18:20

标签: ruby-on-rails-3

我正在努力让那些没有帐户/未登录的人可以看到用户列表和所有用户帖子..

在我的users_controller.rb中我有

class UsersController < ApplicationController
  before_filter :signed_in_user, 
                only: [:index, :edit, :update, :destroy]
  before_filter :correct_user,   only: [:edit, :update]
  before_filter :admin_user,     only: :destroy

  def index
    @users = User.paginate(page: params[:page])
  end

  def show
    @user = User.find(params[:id])
    @microposts = @user.microposts.paginate(page: params[:page])
  end

我猜测before_filter:signed_in_user是什么让它只有签名用户才能访问用户列表/查看用户配置文件。如何在不收到错误的情况下更改此内容?

目前,当我删除第3行的:index部分时,我收到以下错误。

未定义的方法`admin?'为零:NilClass

这是/app/views/users/_user.html.erb

的第4行
<li>
2:   <%= gravatar_for user, size: 52 %>
3:   <%= link_to user.name, user %>
4:   <% if current_user.admin? && !current_user?(user) %>
5:     | <%= link_to "delete", user, method: :delete, confirm: "You sure?" %>
6:   <% end %>
7: </li>

1 个答案:

答案 0 :(得分:0)

我假设您的root :to => 'users#index'文件中有routes.rb这样的内容。

“登录/未登录”行为的常见解决方案涉及根据身份验证状态有条件地重定向,或根据状态呈现各种部分。

index下,您的@users实例变量将始终包含分页用户模型,无论状态如何。但是,我们无法知道signed_in_user的作用。如果您在代码中搜索def signed_in_user,则可以看到它的作用。这可能会揭示应用程序如何处理身份验证状态 - 或者如果这是您正在构建的内容,如何继续。

<强>更新

所以看起来你没有填充current_user对象。这通常是一个返回对象的方法。

如果您使用的是Devise,则可能需要对其进行一些其他配置,以便为您的视图提供current_user辅助方法。

nil错误是由current_user返回nil或根本不存在而导致的。所以它实际上是在尝试nil.admin?并导致错误被提升。

也许你正在寻找的逻辑是,

<li>
<%= gravatar_for user, size: 52 %>
<%= link_to user.name, user %>
<% if current_user.present? && current_user.admin? && !current_user?(user) %>
| <%= link_to "delete", user, method: :delete, confirm: "You sure?" %>
<% end %>

您还可以从Rails调试器控制台调查current_user的值。您可以在控制器中添加debugger语句,然后进行播放。此外,您可以使用Rails控制台(从命令行运行rails console)并在那里玩游戏。

更新2

  

那么为什么填充current_user没有问题呢?   我包含的对象:index。为什么要删除它(见问题   上面)导致current_user变为人口减少

我们无法知道signed_in_user方法中的内容可以进一步调查。

但是,我预感current_user == niltrue,因为您根本没有登录。