Ruby on rails 如何访问Spree';s从main rails应用程序链接到购物车功能

Ruby on rails 如何访问Spree';s从main rails应用程序链接到购物车功能,ruby-on-rails,spree,Ruby On Rails,Spree,我正在将spree shop构建到一个现有的Rails应用程序中,我需要从spree引擎外部访问link_to_cart 链接到购物车可在此处找到: 由于我修改了链接到购物车中的样式,我还创建了: #helpers/spree/base_helper_decorator.rb module Spree module BaseHelper def link_to_cart(text = nil) text = text ? h(text) : Spree.t

我正在将spree shop构建到一个现有的Rails应用程序中,我需要从spree引擎外部访问
link_to_cart

链接到购物车
可在此处找到:

由于我修改了
链接到购物车中的样式,我还创建了:

  #helpers/spree/base_helper_decorator.rb
  module Spree
    module BaseHelper
      def link_to_cart(text = nil)
      text = text ? h(text) : Spree.t('cart')
      css_class = nil

      if simple_current_order.nil? or simple_current_order.item_count.zero?
        text = "#{text}: (#{Spree.t('empty')})"
        css_class = 'empty'
      else
        text = "<i class='fa fa-shopping-cart'></i> #{text}: (#{simple_current_order.item_count})  <span class='amount'>#{simple_current_order.display_total.to_html}</span>".html_safe
        css_class = 'full'
      end

      link_to text.html_safe, spree.cart_path, :class => "cart-info #{css_class} btn btn-small btn-success pull-right", style: "margin-left:10px;"
    end
  end
end

你需要做两件事

  • 创建覆盖
  • 使您的覆盖在主目录中可访问 应用程序
  • 步骤1:我的Spree覆盖位于我的主应用程序的覆盖文件夹中。覆盖应该在您正在装饰的模块上调用
    module\u eval

    #overrides/base_helper_decorator.rb
    Spree::BaseHelper.module_eval do
    
      def link_to_cart(text = nil)
        #Your customizations here
      end
    
    end
    
    步骤2:将下面的一行添加到主应用程序ApplicationController,以访问装饰过的助手

    helper_method :link_to_cart # Add only the link_to_cart method 
    
    helper 'spree/base'         # Add all methods (your decoration plus the default methods) 
                                # from the Spree BaseHelper module to your main app
    

    好的,谢谢本让我走上正轨。以下是我的解决方案:

    # class ApplicationController < ActionController::Base
       include Spree::Core::ControllerHelpers::Order
       include Spree::Core::ControllerHelpers::Auth
       helper Spree::BaseHelper
       helper Spree::StoreHelper
    

    此外,
    helper Spree::StoreHelper
    似乎不再需要显示购物车按钮和当前订单

    您可以将其添加到主应用程序以访问购物车


    您还必须在引擎之外的主应用程序中包含正确的帮助程序。在即将发布的3.2.0版spree中,我只需添加:

    # class ApplicationController < ActionController::Base
      include Spree::Core::ControllerHelpers::Store
      include Spree::Core::ControllerHelpers::Order
      include Spree::Core::ControllerHelpers::Auth
    
    #class ApplicationController

    到我的应用程序控制器,使
    链接到购物车
    在任何地方都能工作。您需要包含多个helper类,因为例如,
    current\u store
    (由其他helper使用)是在
    Spree::Core::ControllerHelpers::store
    中定义的,所以也要添加它以消除任何错误。

    自从Abram留下答案以来,已经有一些更新。这使我走上了正确的道路,但我有一些打嗝。主要原因是当前货币未定义

    application\u controller.rb

    class ApplicationController < ActionController::Base
      include Spree::Core::ControllerHelpers::Order
      include Spree::Core::ControllerHelpers::Auth
      include Spree::Core::ControllerHelpers::Store
      include Spree::Core::ControllerHelpers::Common
      helper Spree::BaseHelper
    
    class ApplicationController
    我覆盖了Spree导航栏,并将其用于我的主应用程序

    当我添加了
    include Spree::Core::ControllerHelpers::Common
    时,它就开始工作了。不幸的是,这会通过spree
    spree_application.html.erb
    布局呈现所有视图。您可能需要覆盖并修改此视图


    此外,所有的css都来自spree。您必须将自定义css移动到spree名称空间并@import.

    不确定原因,但在完成所有操作后,我仍然得到未定义的局部变量或方法“link\u to\u cart”Hi@Abram,我有同样的问题,但解决方案对我无效。有什么提示吗?啊哈,传说中的stackoverflow答案和你需要的准确答案!您在哪里添加了第二个代码段?我试过订购控制器装饰器,但没有雪茄:(不记得了。试试libHmm不走运。在应用程序中尝试了各种组合,也没有走运。真奇怪。将当前的_order_参数函数添加到应用程序控制器并手动指定当前的_货币现在对我有效!谢谢!这让我走上了正确的轨道。似乎对spree进行了一些更新,所以你必须添加
    include Spree::Core::ControllerHelpers::Common
    。这会改变整个应用程序的呈现方式。
    # class ApplicationController < ActionController::Base
      include Spree::Core::ControllerHelpers::Store
      include Spree::Core::ControllerHelpers::Order
      include Spree::Core::ControllerHelpers::Auth
    
    class ApplicationController < ActionController::Base
      include Spree::Core::ControllerHelpers::Order
      include Spree::Core::ControllerHelpers::Auth
      include Spree::Core::ControllerHelpers::Store
      include Spree::Core::ControllerHelpers::Common
      helper Spree::BaseHelper