ActionController :: RoutingError(UserAccountsController的未定义方法`load_and_authorize_resource':Class):

时间:2014-03-29 15:37:31

标签: ruby-on-rails ruby

我是Ruby on Rails的新手,我正试图找到解决方案。 我有一个像这样开始的控制器:

class UserAccountsController < ApplicationController
    include Concerns::UserFinancialContext
    load_and_authorize_resource :except => [:change_contract, :show_modal_simulator_invoice, :project_member_info, :new_account_in_modal, :user_view]

我这里也有一个.rb文件:

app/controllers/concerns/user_financial_context.rb

最后

app/doc/Concerns/UserFinancialContext.html

但出现以下错误:

ActionController::RoutingError (undefined method `load_and_authorize_resource' for UserAccountsController:Class):
  app/controllers/user_accounts_controller.rb:3:in `<class:UserAccountsController>'
  app/controllers/user_accounts_controller.rb:1:in `<top (required)>'

知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

您应该学会阅读错误消息。

从错误消息中,您提供的程序试图调用尚未定义的方法。 Ruby是一种解释型语言,您调用的每个方法都应该在headhead之前定义。

当您调用没有显式接收器的方法时,ruby会将其发送到self对象。在类定义self的主体内部是类本身。在这种情况下,它是UserAccountsController

从方法的名称我假设它实际上应该由cancancancancan gem提供。如果您查看此源文件(记录良好):controller_additions.rb您将看到方法定义:

module ControllerAdditions
  module ClassMethods
    def load_and_authorize_resource(*args)
      cancan_resource_class.add_before_filter(self, :load_and_authorize_resource, *args)
    end
  end
end

以后如何将ApplicationController继承的UserAccountsController提供给该方法:

if defined? ActionController::Base
  ActionController::Base.class_eval do
    include CanCan::ControllerAdditions
  end
end

现在,您通常希望将该gem添加到您的项目中,并根据gem文档将其添加到您的项目Gemfile

gem 'cancancan'

线。

答案 1 :(得分:1)

我在API-only mode中使用Rails并需要修改我的ApplicationController以包含CanCan :: ControllerAdditions,因为它继承自ActionController :: API:

class ApplicationController < ActionController::API
    include CanCan::ControllerAdditions

其他控制器继承自此控制器,例如:

class UsersController < ApplicationController

这是解决the 'elsif',它添加了ActionController :: Base而不是ActionController :: API,尽管两者都是在我的应用程序中定义的(通过gem actionpack)