我正在努力让那些没有帐户/未登录的人可以看到用户列表和所有用户帖子..
在我的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>
答案 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 == nil
为true
,因为您根本没有登录。