我从RailsApps.org开始使用Rails 4.1 Pundit / Devise应用程序,并在用户控制器中调用'authorize User'时继续获取未定义的方法错误。用户可以注册,登录和编辑他们的帐户信息。单击“用户”链接时,会出现以下结果:
UsersController#index中的NoMethodError
未定义的方法`authorize'代表#
这是UsersController ...
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模型的实例,并调用索引?返回true或false的方法。您可能想知道为什么我们可以提供User类(如索引操作中)或@user实例变量(如show动作中)。
当从控制器操作调用authorize时,Pundit会查找策略对象。我们已经看到,如果给出任何这些参数,Pundit将找到UserPolicy:
授权用户 - 用户类
授权@user - 一个实例变量,它是User类的一个实例
授权用户 - 一个简单的变量,它是User类的一个实例
授权@users - 用户对象数组
对我而言,似乎有时候会发现帮助方法,比如show和update,但不是索引。
答案 0 :(得分:3)
此处正在讨论此问题:https://github.com/RailsApps/rails-devise-pundit/issues/10
基本上,您的解决方案是: A)重新启动rails服务器,问题应该消失。每当问题出现时(编辑文件等),您都必须这样做。 (如果有任何安慰,它不应该在生产中发生)
B)将config/intiializers/pundit.rb
中的代码移到ApplicationController中(不带included do...end
块)
答案 1 :(得分:0)
User
是类名,而不是实例。此外authorize
用于创建/更新/编辑操作。对于索引,您应该use Policy。
例如,UserPolicy
:
def index
@users = UserPolicy::Scope.new(current_user, User).resolve
end