1

我正在尝试使用rails-authorization-pluginauthlogicpermit使该方法正常工作,但我一直遇到此错误:

当我尝试:

class ApplicationController < ActionController::Base
  ...
  before_filter permit 'admin'
  ...

我明白了:

Authorization::CannotObtainUserObject in HomeController#index
Couldn't find #current_user or @user, and nothing appropriate found in hash

现在我确实current_user设置了我的方法,并且它可以工作,因为我几乎在我的应用程序的其他任何地方都使用了它:

class ApplicationController < ActionController::Base
  ...

  helper_method :current_user

  private

  def current_user_session
    return @current_user_session if defined?(@current_user_session)
    @current_user_session = UserSession.find
  end

  def current_user
    return @current_user if defined?(@current_user)
    @current_user = current_user_session && current_user_session.record
  end

  ...

我也知道我的数据库中有具有适当角色的用户,因为这种方法有效:

def require_admin
   unless current_user.is_admin? || current_user.is_root?
      flash[:warning] = 'You are not an administrator and cannot access this page.'
      redirect_to root_path
   end
end

如果我只使用以下方法检查用户级别,我可以让一切正常工作:

before_filter :require_admin, :only => 'index'

...但是我不应该能够有效地使用permitand来做同样的事情permit?吗?

任何帮助将非常感激。如果您需要查看更多代码,请告诉我,我很乐意发布。在 Google 上,关于让这两个系统相互协作的问题,我确实没有什么可以让我做出正面或反面的决定。

4

2 回答 2

2

好吧,我想我明白了。

正如贾里德正确指出的那样,正确的用法是

permit 'admin'

(不作为 a 的一部分before_filter)。

然而...

...默认:get_user_method设置为#current_user,这是acts_as_authenticated插件使用的。如前所述,我正在使用 AuthLogic,其中我将方法定义为current_user(不带井号)。

所以,我尝试了以下方法:

permit 'admin', :get_user_method => current_user

只是收到一条很好的错误消息,说明我没有这样的变量或方法。但是,我缺少的是 hash 选项需要一个string,而不是直接调用该方法!(愚蠢的错误,我知道!)

所以

permit 'admin', :get_user_method => 'current_user'

...似乎对我有用。

我喜欢 Ruby 和 Rails,但有时它的简单性本身就是一个诅咒;我总是被简单的东西所拥有。:)

于 2009-10-10T17:58:36.407 回答
0

您使用的插件不正确。它不应该放在前置过滤器中。

在全局级别上,您只需声明:

permit 'admin'

就是这样。

您的所有操作都将查找 current_user 或 @user 对象,如果没有则重定向到登录页面。

在每个操作级别上,您将其用作块:

def index
  permit 'admin' do
    @some_models = SomeModel.all
  end
end
于 2009-10-10T00:25:53.190 回答