设计和授权用户'导致未定义的方法

时间:2014-08-20 01:59:39

标签: ruby-on-rails-4 devise pundit

我从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,但不是索引。

2 个答案:

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