Ruby on rails 如何从已安装的Spree gem';扩展控制器;谁的控制器?

Ruby on rails 如何从已安装的Spree gem';扩展控制器;谁的控制器?,ruby-on-rails,ruby,spree,spree-auth-devise,Ruby On Rails,Ruby,Spree,Spree Auth Devise,我已成功安装spreegem。我不需要spree\u前端。这是Gemfile gem 'spree_core', '4.2.0.rc2' gem 'spree_backend', '4.2.0.rc2' gem 'spree_sample', '4.2.0.rc2' gem 'spree_cmd', '4.2.0.rc2' gem 'spree_auth_devise', '~> 4.2' 因此,我想从Spree的BaseController扩展我的应用程序控制器。代码如下: class

我已成功安装
spree
gem。我不需要
spree\u前端
。这是
Gemfile

gem 'spree_core', '4.2.0.rc2'
gem 'spree_backend', '4.2.0.rc2'
gem 'spree_sample', '4.2.0.rc2'
gem 'spree_cmd', '4.2.0.rc2'
gem 'spree_auth_devise', '~> 4.2'
因此,我想从Spree的BaseController扩展我的
应用程序控制器
。代码如下:

class ApplicationController < Spree::BaseController
  include Spree::Core::ControllerHelpers::Order
end

如何从已安装的Spree gem的控制器扩展控制器?

正如错误所述,
Spree::BaseController
未在应用程序中定义-它在
Spree core
gem中定义。如果您在本地重新创建基本控制器的文件路径,即
app/controllers/spree/
,并将代码从控制器复制并粘贴到本地
base\u controller.rb
,则可以对其进行编辑并添加自定义功能


请注意,它仍将从应用程序控制器继承,但是您可以将想要放入
ApplicationController
中的任何代码放在这里,并让您的类继承自
Spree::BaseContoller
,效果将是相同的。

您有什么理由需要严格扩展
ApplicationController

我建议您使用另一种方法创建一个新的基本控制器类,然后从中继承所有子类,并将
ApplicationController
留给basicrails

app/controller/my_base_controller.rb

class MyBaseController
app/controller/my\u resources\u controller.rb

类MyResourcesController
您遇到的问题是,
Spree::BaseController
已经从
ApplicationController
继承;看见这是为了让您的
应用程序控制器
在Spree看到它之前定义
当前用户
和类似的基本功能

以另一种方式声明它们也会创建一个循环依赖项,因此类加载失败。在不改变狂欢本身的情况下,唯一的解决办法是做其他事情

相反,要让您的控制器使用
Spree::BaseController
作为超类,请首先以更常见的方式定义
ApplicationController
,例如:

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  # ...
end
在定义更具体的控制器时,现在可以使用此
StoreBaseController
代替
ApplicationController
。它之所以能工作,是因为它不会在继承树中创建循环,现在的情况如下:


注意:如果您还使用
rails generator
命令从模板生成控制器或脚手架,请注意,生成器在模板中有
ApplicationController
硬编码,因此创建后需要对其进行修改。

hmmm,我尝试了您想要做的事情,但成功(?)

class PagesController
在控制台中

2.6.5:006>pp PagesController.com
[PagesController,
Spree::Core::ControllerHelpers::Order,
#,
Spree::BaseController,
Spree::Core::ControllerHelpers::CurrencyHelpers,
Spree::Core::ControllerHelpers::strong参数,
...
我正在使用

  • ruby 2.6.5
  • 轨道6.0.3.4
  • 在Gemfile中添加您的spree gems后,运行
    捆绑更新
因此,我认为这是需要或自动加载的问题

  • 你的rails版本是什么?6?spree>=4.1应该使用rails>=6
  • rails控制台中是否存在Spree::BaseController
  • config/application.rb
    中的
    Bundler.require(*Rails.groups)
  • 宝石是否包含在Gemfile的正确组中?例如:spree gems包含在:production组中
  • 它是否在
    config/application.rb
    中有
    config.load\u默认值6.0

class ApplicationController<::Spree::BaseController他们感谢您的回复。但它不起作用:(嗨,谢谢你的回复。在
base\u controller
中有大量的助手,包括其他控制器。我无法复制和粘贴所有的助手。这不是一种正确的方法。知道吗?嘿,谢谢你的回复。这只是个例子。我的问题是我无法从
Spree::BaseController
继承我的控制器。请看我的问题。当我继承时从
Spree::BaseController
I获取
未初始化的常量Spree::BaseController(NameError)
错误。是的,因为Rails在内部使用了
ApplicationController
,而Rails试图访问它时,会出现未定义的错误。但是,如果您使用Rails内部未访问的自定义控制器,则错误将消失。我测试了以下示例,它是正常的。我只是想确定一下,这是正确的目前还没有具体的案例来更改Rails的继承
ApplicationController
与我的意思相同,但描述得更好:)很好的调查
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  # ...
end
# app/controllers/store_base_controller.rb
class StoreBaseController < Spree::BaseController
  include Spree::Core::ControllerHelpers::Order
  # ...
end