0

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

在我的 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 部分时,出现以下错误。

未定义的方法“管理员?” 对于零: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>
4

1 回答 1

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 %>

您还可以current_user从 Rails 调试器控制台调查 ​​的值。你可以在你的控制器中添加一个debugger语句,然后到处玩。此外,您还可以使用 Rails 控制台(从命令行运行rails console)并在那里玩耍。

更新 2

那么为什么当我包含 :index 时填充 current_user 对象没有问题。为什么删除它(见上面的问题)会导致 current_user 变得人口稀少

我们不知道signed_in_user进一步调查的方法是什么。

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

于 2012-08-06T22:59:35.860 回答