当前位置: 首页 > 知识库问答 >
问题:

操作控制器::路由错误 - 未定义的局部变量或方法“inherit_resources”升级后

傅穆冉
2023-03-14

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

在2016-06-24 11:54:37 0530开始获取127.0.0.1的“/signup.html”

ActionController::RoutingError-未定义AccountsController的局部变量或方法inherit_resources:Class:actionpack(4.0.0)lib/action_dispatch/routing/route_set。rb:69:inrescue-in-controller的actionpack(4.0.0)lib/action_dispatch/routing/route_set。rb:64:incontroller的actionpack(4.0.0)lib/action_dispatch/routing/route_set。rb:44:in调用“actionpack(4.0.0)lib/action_dispatch/trively/router”。rb:71:inblock-in-call'
actionpack(4.0.0)lib/action_dispatch/trively/router。rb:59:in
调用“actionpack(4.0.0)lib/action_dispatch/routing/route_set”。rb:655:in调用“meta_request(0.4.0)lib/meta_requist/middlewares/app_request_handler”。rb:13:in调用'
meta_request(0.4.0)lib/meta_requist/middlewares/metarequest_handler。rb:13:in调用'
warden(1.0.6)lib/warden/manager。rb:35:in
block-in-call'warden(1.0.6)lib/warden/manager中的块。rb:34:in调用“client_side_validations(3.0.12)lib/client_side_validations/middleware”。rb:17:incall'rack(1.5.5)lib/rack/etag中。rb:23:incall'rack(1.5.5)lib/rack/conditionalget。rb:25:incall'rack(1.5.5)lib/rack/head中。rb:11:in调用“remotipart(1.2.1)lib/remotipart/middleware”。rb:27:in调用“actionpack(4.0.0)lib/action_dispatch/middleraftware/params_parser”。rb:27:in调用'
actionpack(4.0.0)lib/action_dispatch/中间件/flash。rb:241:在
call'rack(1.5.5)lib/rack/session/abstract/id中。rb:225:incontext'rack(1.5.5)lib/rack/session/abstract/id。rb:220:in调用'
actionpack(4.0.0)lib/action_dispatch/midleftware/cookies。rb:486:in调用“activerecord(4.0.0)lib/activerecord/query_cache”。rb:36:in调用“activerecord(4.0.0)lib/activerecord/connection_adapters/abstract/connection_pool”。rb:626:in调用“activerecord(4.0.0)lib/activerecord/migration”。rb:369:在call中调用“actionpack(4.0.0)lib/action_dispatch/middleraftware/callbacks”。rb:29:inblock-in-call'
activesupport(4.0.0)lib/active_support/callbacks。rb:373:在
_run_139117187983862327_call__callbacks'activesupport(4.0.0)lib/active_support/callbacks中。rb:80:inrunccallbacks的actionpack(4.0.0)lib/actiondispatch/middleraftware/callbacks。rb:27:in调用'
rails-dev-tooks(1.2.0)lib/rails_dev_tweaks/granular_autoload/中间件。rb:36:in调用'
actionpack(4.0.0)lib/action_dispatch/中间件/remote_ip。rb:76:in
call‘airbrake(4.3.7)lib/arbrake/rails/middleware。rb:13:in调用“better_errors(2.1.1)lib/better_errors/middleware”。rb:84:inprotected_app_call的better_errors(2.1.1)lib/better_errors/middleware。rb:79:inbetter_errors_call(2.1.1)lib/better_errors/middleware中。rb:57:in调用'
actionpack(4.0.0)lib/action_dispatch/midleftware/debug_exceptions。rb:17:in调用'
rack contrib(1.4.0)lib/rack/contrib/response_headers。rb:17:in
调用“meta_request(0.4.0)lib/meta_requist/middlewares/headers”。rb:16:in调用“actionpack(4.0.0)lib/action_dispatch/midleftware/show_exceptions”。rb:30:in调用'
railties(4.0.0)lib/rails/rack/logger。rb:38:incallapp'railties(4.0.0)lib/rails/rack/logger中。rb:21:in块中调用“activesupport(4.0.0)lib/active_support/tagged_logging”。rb:67:在标记为“activesupport(4.0.0)lib/active_support/tagged_logging”的块中。rb:25:in标记了“activesupport(4.0.0)lib/active_support/tagged_logging”。rb:67:intagged'铁路(4.0.0)lib/rails/rack/logger。rb:21:in调用“actionpack(4.0.0)lib/action_dispatch/middleraftware/requestid”。rb:21:incall'rack(1.5.5)lib/rack/methodoveride。rb:21:incall'rack(1.5.5)lib/rack/runtime中。rb:17:in调用“activesupport(4.0.0)lib/active_support/cache/stategy/local_cache”。rb:83:incall'rack(1.5.5)lib/rack/lock中。rb:17:in调用“actionpack(4.0.0)lib/action_dispatch/middleraftware/static”。rb:64:in调用'airbrake(4.3.7)lib/arbrake/user_informator。rb:16:在_call的airbrake(4.3.7)lib/arbrake/user_informer中。rb:12:incall'railties(4.0.0)lib/rails/engine中。rb:511:incall'railties(4.0.0)lib/rails/application。rb:97:incall'rack(1.5.5)lib/rack/content_length中。rb:14:in调用“thin(1.5.1)lib/thin/connection”。rb:81:inblock-in-pre_process'thin(1.5.1)lib/thin/connection。rb:79:inpre_process'thin(1.5.1)lib/thin/connection。rb:54:inprocess的thin(1.5.1)lib/thin/connection。rb:39:inreceive_data'事件机器(1.0.9)lib/eventmachine。rb:193:inrun'thin(1.5.1)lib/thin/backends/base。rb:63:instart‘thin(1.5.1)lib/thin/server’。rb:159:instart'rack(1.5.5)lib/rack/handler/thin中。rb:16:inrun'rack(1.5.5)lib/rack/server。rb:264:instart'railties(4.0.0)lib/rails/commands/server中。rb:84:instart’railties(4.0.0)lib/rails/commands中。rb:78:inblock-in'railties(4.0.0)lib/rails/commands中的块。rb:73:在<代码>中

在我以前的版本中,routes文件是这样的:

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

升级后,我将其更改为:

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

对于所有路由,“匹配”将替换为“get”。

这是我们用inherited_resourcesaccounts_controller。

class AccountsController < ApplicationController

  inherit_resources

  ssl_required :new, :create

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

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

我找不到它们被使用的原因,在Gemfile中也找不到。请帮我修复这个错误。

共有1个答案

蔚俊人
2023-03-14

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

相反,您可以删除它并在控制器中定义路由,就像您通常所做的那样:

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

这是继承资源添加到控制器中的大纲,目的是拥有“胖模型和瘦控制器”。你可以找到其他做类似事情的宝石,但在我看来,为了便于阅读,我宁愿自己添加这些方法。

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

 类似资料:
  • 本文向大家介绍Laravel框架路由和控制器的绑定操作方法,包括了Laravel框架路由和控制器的绑定操作方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Laravel框架路由和控制器的绑定操作方法。分享给大家供大家参考,具体如下: 路由和控制器的关系 路由文件地址在\app\Http\routes.php,我们来看两种不同的路由。 以上均为绑定匿名函数的路由,虽然可以返回视图,也可以

  • 在Laravel5.2中,我想将所有未定义的url路由到一个特定的控制器。 我正在开发类似CMS的功能,我想要这个东西。 所以url喜欢 www.domain.com/post/po-t/some/thing www.domain。com/profile 所以第一个url应该重定向到页面函数,第二个url应该重定向到配置文件函数 基本上,我想要一些关于N-number或参数的想法,因为在页面中,它

  • 我订阅了一个方法中的一个可观察的,需要在另一个方法中取消订阅。从一个初始化函数调用子计数器()方法,其内容工作正常。 当我调用我的touchActivate()函数时,它包含一个对存储的变量的unsubscribe函数,但是它会抛出一个错误,因为未定义。控制台日志记录返回一个未定义的对象。 在类的顶部,我定义了一个变量:

  • 我一直在致力于将我们的应用程序从React.js 0.13升级到15.4.2以及与之相关的依赖项。我可能很接近,但经过4天50个小时后,我终于到了终点,我最后的希望。 在升级过程中,react路由器被升级到4.0.0版,每个文档、教程和堆栈溢出问题都显示了如何编写路由器(所有这些都必须是正确的),但是,当我这样做时,它总是失败。要么说历史是必需的属性,要么当我通过示例添加它时,它仍然显示为未定义和

  • 自定义路由 easySwoole支持路由拦截。其路由利用fastRoute实现,因此其路由规则与其保持一致,该组件的详细文档请参考 GitHub文档 路由定义 若需要再easySwoole使用路由拦截功能,请在应用目录(默认为App)下,建立Router类,井继承Core\AbstractInterface\AbstractRouter实现addRouter方法,如果在类UNIX系统下请严格注意文

  • 7.5.10 局部变量的定义 局部变量的定义格式: LOCAL 变量名[[数量]] [:数据类型] [,变量名[[数量]] [:数据类型]]... 伪指令LOCAL的作用是说明一个或多个临时的局部变量(位于堆栈中)。局部变量必须在任何指令之前加以说明,并可用多个LOCAL伪指令来说明其局部变量。 在子程序中,若说明了某个局部变量,则子程序体中的指令就可使用该局部变量。汇编程序会把对它的引用转换成用