3

我从 RailsApps.org 的 Rails 4.1 Pundit / Devise 应用程序开始,并在用户控制器中调用“授权用户”时继续出现未定义的方法错误。用户可以注册、登录和编辑他们的帐户信息。单击“用户”链接时,会出现以下结果:

用户控制器中的 NoMethodError#index

未定义的方法“授权”#

这是用户控制器...

class UsersController < ApplicationController

  before_filter :authenticate_user!
  after_action :verify_authorized

  def index
    @users = User.all
    authorize User    # <== This is the line the error occurs on
  end

  def show
    @user = User.find(params[:id])
    authorize @user
  end

  def update
    @user = User.find(params[:id])
    authorize @user
    if @user.update_attributes(secure_params)
      redirect_to users_path, :notice => "User updated."
    else
      redirect_to users_path, :alert => "Unable to update user."
    end
  end

  def destroy
    user = User.find(params[:id])
    authorize user
    user.destroy
    redirect_to users_path, :notice => "User deleted."
  end

  private

  def secure_params
    params.require(:user).permit(:role)
  end

end

ApplicationController

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
end

关于如何解决这个问题的任何想法?

提前致谢!

评论:这是来自 RailsApp Pundit 快速入门指南来解释授权

关键字 authorize 是一个辅助方法,它为实现实际授权的较长语句提供了快捷方式。我们从来没有看到完整的语句,因为我们使用了 helper 方法,但如果我们使用它,它看起来像这样:

引发“未授权”,除非 UserPolicy.new(current_user, User).index?

授权助手方法找到一个 UserPolicy 类并实例化它,传递 current_user 对象和 User 类或 User 模型的实例,然后调用索引?方法返回真或假。您可能想知道为什么我们可以提供 User 类(如在 index 操作中)或 @user 实例变量(如在 show 操作中)。

当从控制器操作调用授权时,Pundit 会查找策略对象。我们已经看到,如果给定以下任何参数,Pundit 将找到 UserPolicy:

  • 授权用户 - 用户类

  • authorize @user – 一个实例变量,它是 User 类的一个实例

  • 授权用户——一个简单的变量,它是用户类的一个实例

  • 授权 @users – 一组用户对象

对我来说,似乎有时会在显示和更新中找到辅助方法,但在索引中却没有。

4

2 回答 2

3

看起来这个问题正在这里讨论:https ://github.com/RailsApps/rails-devise-pundit/issues/10

基本上,您的解决方案是: A) 重新启动 rails 服务器,问题应该会消失。每当出现问题(编辑文件等)时,您都必须这样做。(如果有任何安慰的话,它不应该在生产中发生)

B)将代码移入config/intiializers/pundit.rbApplicationController(不带included do...end块)

于 2014-09-30T14:26:44.150 回答
0

User是类名,而不是实例。也authorize用于创建/更新/编辑操作。对于索引,您应该使用 Policy

例如UserPolicy

def index
  @users = UserPolicy::Scope.new(current_user, User).resolve
end
于 2014-08-20T02:49:20.037 回答