Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用spree多域更改部分模板_Ruby On Rails_Ruby_Erb_Spree - Fatal编程技术网

Ruby on rails 使用spree多域更改部分模板

Ruby on rails 使用spree多域更改部分模板,ruby-on-rails,ruby,erb,spree,Ruby On Rails,Ruby,Erb,Spree,我有一个使用的spree存储,自述文件中有关于如何切换布局文件的说明 这些布局应该位于app/views/spree/layouts/storecode/目录中的站点主题扩展中。因此,如果您的商店代码为alpha,则应将其默认布局存储在app/views/spree/layouts/alpha/spree_application.html.erb中 这很好,但现在我不确定如何更改其他模板,如home/index.html.erb。据我所知,这些文件被呈现到布局模板的屈服部分,但我不确定如何使用它

我有一个使用的spree存储,自述文件中有关于如何切换布局文件的说明

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


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

只需使用它创建一个初始值设定项multi_domain.rb,并具有两个或多个具有唯一代码的存储

store1=Spree::Store.find_bycode:first_Store

store2=Spree::Store.find_bycode: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个域的真实商店中工作。

我修改了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_应用程序仍然需要在视图/spree/layouts/

中运行,但alias_method_chain现在在rails 5.1中被弃用。