Rails 4:“views/layouts”文件夹外部的布局文件

Fai*_*hid 2 layout ruby-on-rails path

默认情况下,rails 在路径中查找布局视图文件views/layouts。但是,我想将其更改为app/themes/theme-name/layout.html.erb特定控制器。为此,我使用以下代码:

class ContentController < ApplicationController
  before_filter :set_theme

  def set_theme
    theme = "default"
    prepend_view_path "app/themes/#{theme}" # change default view path
    self.class.layout "../../themes/#{theme}/layout" # change default layout path
  end
end
Run Code Online (Sandbox Code Playgroud)

但这段代码抛出以下错误:

Missing template layouts/../../themes/default/layout with {:locale=>[:en], :format .....
Run Code Online (Sandbox Code Playgroud)

它仍在查找布局文件夹。我该如何解决这个问题。

ste*_*ddy 5

替换这一行:

self.class.layout "../../themes/#{theme}/layout"
Run Code Online (Sandbox Code Playgroud)

有了这个:

self.class.layout Rails.root+"/themes/#{theme}/layout"
Run Code Online (Sandbox Code Playgroud)

更新:

默认情况下,Rails 会在文件夹中查找布局app/view/layouts。这是配置使用的路径。要添加另一个路径(如app/themes/theme-name/layouts视图路径列表),您需要将其添加到config/application.rb如下所示:

  class Application < Rails::Application
    ...
    config.paths["app/views"] << "app/themes/theme-name/"
    ...
  end
Run Code Online (Sandbox Code Playgroud)

重新启动服务器。现在,如果您的文件夹中有一个布局文件“alpha.html.erb” app/themes/theme-name/layouts,您可以在控制器中使用它,如下所示:

layout "alpha"
Run Code Online (Sandbox Code Playgroud)

layouts/alpha.html.erbRails 将在配置的路径中查找。

您始终可以即兴发挥以满足您的需求。希望能帮助到你。