gpt4 book ai didi

ruby-on-rails - 如何从已安装的 Spree gem Controller 扩展我的 Controller ?

转载 作者:行者123 更新时间:2023-12-02 19:00:23 25 4
gpt4 key购买 nike

我已经成功安装了 spree gem。我不需要 spree_frontend。这是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 扩展我的 ApplicationController。这是代码:

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

但我收到以下错误:

uninitialized constant Spree::BaseController (NameError)

如何从已安装的 Spree gem Controller 扩展我的 Controller ?

最佳答案

您遇到的问题是 Spree::BaseController 已经继承自 ApplicationController;请参阅https://github.com/spree/spree/blob/master/core/app/controllers/spree/base_controller.rb 。这是为了让您的 ApplicationController 在 Spree 看到之前定义诸如 current_user 之类的内容以及类似的基本函数。

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

相反,要让您的 Controller 使用 Spree::BaseController 作为父类(super class),请首先以更常见的方式定义 ApplicationController,例如:

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
# ...
end

然后发明一个新的抽象 Controller ,供您自己使用,它继承自 Spree,例如我们将其命名为 StoreBaseController:

# app/controllers/store_base_controller.rb
class StoreBaseController < Spree::BaseController
include Spree::Core::ControllerHelpers::Order
# ...
end

在定义更具体的 Controller 时,现在可以使用此StoreBaseController来代替ApplicationController。它之所以有效,是因为它不会在继承树中创建循环,继承树现在看起来像这样:

Controller Hierarchy

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

关于ruby-on-rails - 如何从已安装的 Spree gem Controller 扩展我的 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65639168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com