【问题标题】:Changing partial templates using spree-multi-domain使用 spree-multi-domain 更改部分模板
【发布时间】:2017-09-15 03:48:05
【问题描述】:

我有一个使用spree-multi-domain 的狂欢商店,自述文件中有关于如何切换布局文件的说明

这些布局应位于 app/views/spree/layouts/store#code/ 目录中您网站的主题扩展中。因此,如果您的商店的代码为“alpha”,则应将其默认布局存储在 app/views/spree/layouts/alpha/spree_application.html.erb

这很好用,但现在我不确定如何更改其他模板,如 home/index.html.erb。据我了解,这些文件被渲染到布局模板的yield 部分,但我不确定如何使用它为不同的域设置不同的模板。

【问题讨论】:

    标签: ruby-on-rails ruby erb spree


    【解决方案1】:

    只需使用它创建一个初始化器 multi_domain.rb 并拥有两个或多个具有唯一代码的商店

    store1 = Spree::Store.find_by(code: "first_store")

    store2 = Spree::Store.find_by(code: "second_store")

    你的观点是这样分开的:

    app/views/spree/first_store/home/index.html.erb

    app/views/spree/second_store/home/index.html.erb

    初始化器:

    # config/multi_domain.rb
    ActionView::PartialRenderer.class_eval do
      def find_template_with_multi_store(path, locals)
        prefixes = path.include?(?/) ? [] : @lookup_context.prefixes
    
        store_prefixes = prefixes
        store_path     = path
    
        if @view.respond_to?(:current_store) && @view.current_store && !@view.controller.is_a?(Spree::Admin::BaseController)
          store_prefixes = (store_prefixes.map { |i| i.gsub('spree/', "spree/#{@view.current_store.code}/") } + store_prefixes).uniq unless store_prefixes.nil?
          store_path     = store_path.gsub('spree/', "spree/#{@view.current_store.code}/") unless store_path.nil?
        end
    
        begin
          @lookup_context.find_template(store_path, store_prefixes, true, locals, @details)
        rescue ::ActionView::MissingTemplate
          @lookup_context.find_template(path, prefixes, true, locals, @details)
        end
      end
    
      alias_method_chain :find_template, :multi_store
    end
    
    ActionView::TemplateRenderer.class_eval do
      def find_template_with_multi_store(name, prefixes = [], partial = false, keys = [], options = {})
        if prefixes.nil?
          store_prefixes = nil
        elsif @view.respond_to?(:current_store) && @view.current_store && !@view.controller.is_a?(Spree::Admin::BaseController)
          spree = /^spree\//
    
          store_prefixes = []
    
          prefixes.each do |i|
            store_prefixes << i.gsub(spree, "spree/#{@view.current_store.code}/") if i.match(spree)
          end
    
          store_prefixes = (store_prefixes + prefixes).uniq
        else
          store_prefixes = prefixes
        end
    
        begin
          @lookup_context.find_template(name, store_prefixes, partial, keys, options)
        rescue ::ActionView::MissingTemplate
          @lookup_context.find_template(name, prefixes, partial, keys, options)
        end
      end
      alias_method_chain :find_template, :multi_store
    end
    

    此实现适用于具有 10 个域的真实商店。

    【讨论】:

    • 这种工作,但 alias_method_chain 现在在 Rails 5.1 中已弃用。
    【解决方案2】:

    我修改了来自 gonzalo moreno caballero 的答案,使其适用于 rails 5.1

    只需像这样存储您的视图

    app/views/spree/first_store/home/index.html.erb

    app/views/spree/second_store/home/index.html.erb

    并将其添加到 config/initializers/multi_domain.rb

    module PartialRendererMultiStore
      def find_template(path, locals)
        prefixes = path.include?(?/) ? [] : @lookup_context.prefixes
    
        store_prefixes = prefixes
        store_path     = path
    
        if @view.respond_to?(:current_store) && @view.current_store && !@view.controller.is_a?(Spree::Admin::BaseController)
          store_prefixes = (store_prefixes.map { |i| i.gsub('spree/', "spree/#{@view.current_store.code}/") } + store_prefixes).uniq unless store_prefixes.nil?
          store_path     = store_path.gsub('spree/', "spree/#{@view.current_store.code}/") unless store_path.nil?
        end
    
        begin
          @lookup_context.find_template(store_path, store_prefixes, true, locals, @details)
        rescue ::ActionView::MissingTemplate
          @lookup_context.find_template(path, prefixes, true, locals, @details)
        end
      end
    end
    
    
    class ActionView::PartialRenderer
      prepend PartialRendererMultiStore
    end
    
    module TemplateRendererMultiStore
      def find_template(name, prefixes = [], partial = false, keys = [], options = {})
        if prefixes.nil?
          store_prefixes = nil
        elsif @view.respond_to?(:current_store) && @view.current_store && !@view.controller.is_a?(Spree::Admin::BaseController)
          spree = /^spree\//
    
          store_prefixes = []
    
          prefixes.each do |i|
            store_prefixes << i.gsub(spree, "spree/#{@view.current_store.code}/") if i.match(spree)
          end
    
          store_prefixes = (store_prefixes + prefixes).uniq
        else
          store_prefixes = prefixes
        end
    
        begin
          @lookup_context.find_template(name, store_prefixes, partial, keys, options)
        rescue ::ActionView::MissingTemplate
          @lookup_context.find_template(name, prefixes, partial, keys, options)
        end
      end
    end
    
    class ActionView::TemplateRenderer
      prepend TemplateRendererMultiStore
    end
    

    spree_application还是要进去views/spree/layouts/&lt;store_code&gt;/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 2015-11-16
      • 2016-08-14
      相关资源
      最近更新 更多