restful_authentication:授权? = NoMethodError(但是logged_in?工作得很好......?)

时间:2008-11-18 17:53:30

标签: ruby-on-rails authentication

我不明白为什么一个方法可以工作而另一个方法会抛出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?)。

_

是什么给出了?

3 个答案:

答案 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