我不明白为什么一个方法可以工作而另一个方法会抛出NoMethodError,如果它们来自同一个lib文件。
# app/views/bunnies/show.html.erb
<% if logged_in? %>
<%= current_user.login %> |
<%= link_to 'Logout', logout_path %> |
<% if authorized? %>
<%= link_to 'Edit Details', edit_bunny_path(@broker) %> |
<% end %>
<%= link_to 'Back', bunnies_path %>
<% end %>
...为authorized?
抛出NoMethodError。如果我评论如果阻止,页面工作正常(使用logged
)。_
in?
_
是什么给出了?
答案 0 :(得分:2)
我猜你在抛出错误时没有登录。 NoMethod不是指#authorized?。它实际上是指current_user的#login方法。如果您尚未登录,则current_user为nil,在#authorized中调用current_user.login时会产生NoMethod。
任何授权的帮手?检查用户状态应包括检查logged_in?首先要绕过这个问题。试试这个......
def authorized?
logged_in? and current_user.login == "admin"
end
如果没有登录,你就会退出条件,除非你确实有一个可用的对象,否则你不会尝试访问#login方法。
您还可以查看一些与Restful_Authentication一起使用的基于角色的可用身份验证方案。如果您的访问模式比检查管理员更复杂,那么使用其中一个插件会更容易。
顺便说一句,在authenticated_system.rb中更远的地方你会发现这段代码:
# Inclusion hook to make #current_user and #logged_in?
# available as ActionView helper methods.
def self.included(base)
base.send :helper_method, :current_user, :logged_in?, :authorized? if base.respond_to? :helper_method
end
这使得此模块中的方法可用作视图中的辅助方法。如果向authenticated_system.rb添加一个返回用户状态的方法(例如,类似#superuser?),则需要在该代码中将该方法符号添加到base.send调用中。同样,如果您发现自己编写了大量用于访问控制的代码,那么学习其中一个插件将是有序的。
答案 1 :(得分:1)
def is_admin?
logged_in? && current_user.login == "admin"
end
就够了
答案 2 :(得分:0)
是的,所以我仍然不明白为什么那不起作用,但我找到了另一种解决方案。
(1)保持authenticated_system.rb原样。
(2)向controller / application.rb添加辅助方法:
helper_method :is_admin?
def is_admin?
if logged_in? && current_user.login == "admin"
true
else
false
end
end
(3)使用辅助方法而不是authorized?
。如果有人想解释为什么原始代码不起作用,我全都听见了!
(感谢this post)