【问题标题】:ActionController::RoutingError - undefined local variable or method `inherit_resources' after upgradingActionController::RoutingError - 升级后未定义的局部变量或方法“inherit_resources”
【发布时间】:2016-10-26 18:10:07
【问题描述】:

我将我的 rails 版本从 3.2.13 升级到 4.0.0,我还升级了我的 gem。当我从本地服务器运行应用程序时,这是我得到的错误:

于 2016-06-24 11:54:37 +0530 开始 GET "/signup.html" for 127.0.0.1

ActionController::RoutingError - 未定义的局部变量或方法 inherit_resources' for AccountsController:Class: actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:69:inrescue 在控制器中' actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:64:in controller' actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:44:incall' 动作包 (4.0.0) lib/action_dispatch/journey/router.rb:71:in block in call'
actionpack (4.0.0) lib/action_dispatch/journey/router.rb:59:in
call' actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:655:in call' meta_request (0.4.0) lib/meta_request/middlewares/app_request_handler.rb:13:incall'
元请求(0.4.0) lib/meta_request/middlewares/meta_request_handler.rb:13:in call'
warden (1.0.6) lib/warden/manager.rb:35:in
block in call'warden (1.0.6) lib/warden/manager.rb:34:in call' client_side_validations (3.0.12) lib/client_side_validations/middleware.rb:17:incall' 机架 (1.5.5) lib/rack/etag.rb:23:in call' rack (1.5.5) lib/rack/conditionalget.rb:25:incall' 机架 (1.5.5) lib/rack/head.rb:11:in call' remotipart (1.2.1) lib/remotipart/middleware.rb:27:incall' actionpack (4.0.0) lib/action_dispatch/middleware/params_parser.rb:27:in call'
actionpack (4.0.0) lib/action_dispatch/middleware/flash.rb:241:in
call' 机架 (1.5.5) lib/rack/session/abstract/id.rb:225:in context' rack (1.5.5) lib/rack/session/abstract/id.rb:220:incall'
actionpack (4.0.0) lib/action_dispatch/middleware/cookies.rb:486:in call' activerecord (4.0.0) lib/active_record/query_cache.rb:36:in call'活动记录(4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in call' activerecord (4.0.0) lib/active_record/migration.rb:369:in call' 动作包 (4.0.0) lib/action_dispatch/middleware/callbacks.rb:29:in block in call'
activesupport (4.0.0) lib/active_support/callbacks.rb:373:in
_run__139117187983862327__call__callbacks' activesupport (4.0.0) lib/active_support/callbacks.rb:80:in run_callbacks' actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:27:incall'
rails-dev-tweaks (1.2.0) lib/rails_dev_tweaks/granular_autoload/middleware.rb:36:in call'
actionpack (4.0.0) lib/action_dispatch/middleware/remote_ip.rb:76:in
call' airbrake (4.3.7) lib/airbrake/rails/middleware.rb:13:in call' better_errors (2.1.1) lib/better_errors/middleware.rb:84:in protected_app_call'better_errors (2.1.1) lib/better_errors/middleware.rb:79:in better_errors_call'
better_errors (2.1.1) lib/better_errors/middleware.rb:57:in
call'
动作包 (4.0.0) lib/action_dispatch/middleware/debug_exceptions.rb:17:in call'
rack-contrib (1.4.0) lib/rack/contrib/response_headers.rb:17:in
call' meta_request (0.4.0) lib/meta_request/middlewares/headers.rb:16:in call' actionpack (4.0.0) lib/action_dispatch/middleware/show_exceptions.rb:30:incall'
railties (4.0.0) lib/rails/rack/logger.rb:38:in call_app' railties (4.0.0) lib/rails/rack/logger.rb:21:inblock in call' activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in block in tagged'
activesupport (4.0.0) lib/active_support/tagged_logging.rb:25:in
tagged' activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in tagged' railties (4.0.0) lib/rails/rack/logger.rb:21:incall' actionpack (4.0.0) lib/action_dispatch/middleware/request_id.rb:21:in call' rack (1.5.5) lib/rack/methodoverride.rb:21:incall' 机架 (1.5.5) lib/rack/runtime.rb:17:in call' activesupport (4.0.0) lib/active_support/cache/strategy/local_cache.rb:83:incall' 机架 (1.5.5) lib/rack/lock.rb:17:in call' actionpack (4.0.0) lib/action_dispatch/middleware/static.rb:64:incall'airbrake (4.3.7) lib/airbrake/user_informer.rb:16:in _call' airbrake (4.3.7) lib/airbrake/user_informer.rb:12:incall' railties (4.0.0) lib/rails/engine.rb:511:in call' railties (4.0.0) lib/rails/application.rb:97:incall' 机架 (1.5.5) lib/rack/content_length.rb:14:in call' thin (1.5.1) lib/thin/connection.rb:81:inblock in pre_process'thin (1.5.1) lib/thin/connection.rb:79:in pre_process' thin (1.5.1) lib/thin/connection.rb:54:inprocess'thin (1.5.1) lib/thin/connection.rb:39:in receive_data' eventmachine (1.0.9) lib/eventmachine.rb:193:inrun'thin (1.5.1) lib/thin/backends/base.rb:63:in start' thin (1.5.1) lib/thin/server.rb:159:instart' 机架 (1.5.5) lib/rack/handler/thin.rb:16:in run' rack (1.5.5) lib/rack/server.rb:264:instart' railties (4.0.0) lib/rails/commands/server.rb:84:in start' railties (4.0.0) lib/rails/commands.rb:78:inblock in 'railties (4.0.0) lib/rails/commands.rb:73:in <top (required)>' railties (4.0.0) lib/rails/app_rails_loader.rb:43:inblock in exec_app_rails' railties (4.0.0) lib/rails/app_rails_loader.rb:32:in exec_app_rails' railties (4.0.0) lib/rails/cli.rb:6:in' railties (4.0.0) bin/rails:9:in <top (required)>' () home/user/.rvm/gems/ruby-2.3.0@project/bin/rails:23:in' () home/user/.rvm/gems/ruby-2.3.0@project/bin/ruby_executable_hooks:15:in `'

在我之前的版本中,路由文件是这样的:

 match '/signup'   => 'accounts#new', :plan => 'year'

升级后我改成:

get '/signup'   => 'accounts#new', :plan => 'year'

所有路由的“match”都替换为“get”。

这是我们使用inherited_resources 的accounts_controller。

class AccountsController < ApplicationController

  inherit_resources

  ssl_required :new, :create

  before_filter :authenticate_user!, :except => [:new, :create]

  ...................
end

我无法追踪为什么要使用它们,也无法在 Gemfile 中找到它。请帮我解决这个错误。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    inherit_resources 旨在干掉使用 REST 约定的控制器。它是一个已弃用的 gem,并且不再在 Rails 4 中维护。inherit_resources 将基本上继承自 InheritedResources::Base,它具有预定义的 REST 方法。

    相反,您可以像往常一样删除它并在控制器中定义路由:

    class AccountsController < ApplicationController
      ssl_required :new, :create
    
      before_filter :authenticate_user!, :except => [:new, :create]
    
      def index
        @accounts = Accounts.all
      end
    
      def show
        @account = Account.find(params[:id])
      end
    
      def new
        @account = Account.new
      end
    
      def create
        @account = Account.new(account_params)
        if @account.save
          redirect_to @account
        else
          render 'new'
        end
      end
    
      def edit
        @account = Account.find(params[:id])
      end
    
      def update
        @account = Account.find(params[:id])
        if @account.update_attributes(account_params)
          flash[:notice] = "Successfully updated account!"
          redirect_to @account
        else
          render 'edit'
        end
      end
    
      def destroy
        @account = Account.find(params[:id])
        @account.destroy
        redirect_to accounts_path
      end
    
      private
    
        def account_params
          params.require(:account).permit(:name, :email, etc) # Look up strong params if you are unfamiliar. The name, email, etc. are going to be the only permitted params passed in the methods above as a safety feature so you have to permit the fields being created here.
        end
    

    这是为了拥有“胖模型和瘦控制器”而将继承资源添加到控制器中的概述。您可以找到做类似事情的其他 gem,但在我看来,我宁愿自己添加这些方法以提高可读性。

    编辑:它正在添加这些方法定义,但取决于您的应用程序将定义这些方法中的内容。这将是我最好的粗略猜测。 Rails 4 中的新功能也是添加了强大的参数。在创建和更新操作中,您会看到 account_params 从私有方法调用,而不是使用方法内的原始参数进行更新。

    【讨论】:

    • 项目是否公开?
    • 没有。如果需要,我可以为您提供控制器代码或任何其他代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 2012-03-23
    • 2020-02-24
    相关资源
    最近更新 更多