Rails 5渲染位于’views’目录之外的模板

以下代码

def show render File.join(Rails.root, 'app', 'themes', 'default_theme', 'template'), layout: File.join(Rails.root, 'app', 'themes', 'default_theme', 'layout') end 

在rails 4.2.x中工作,但在使用Rails 5.0.0时输出以下错误

 ActionView::MissingTemplate: Missing template vagrant/app/themes/default_theme/template with {:locale=>[:nl], :formats=>[:html], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby]}. Searched in: * "/vagrant/app/views/themes/default_theme" * "/vagrant/app/views" * "/home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/bundler/gems/devise-ebe65b516b38/app/views" * "/home/vagrant/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/devise-i18n-1.1.0/app/views" 

看起来它只在’app / views / *’目录中搜索。 有没有办法使用rails 5.0.0渲染位于’views’目录之外的模板,所以它的工作原理就像以前的Rails版本一样?

您必须将新文件夹添加到配置中:

 config.paths["app/views"].unshift(Rails.root.join("/vendor/myapp/views/myctrl").to_s) 

或者您的控制器:

 before_filter { prepend_view_path(Rails.root.join("vendor/myapp/views/myctrl").to_s) } 

资源

首先添加视图路径:

 class ApplicationController prepend_view_path( Rails.root.join('app/templates') ) # ... end 

然后,您可以通过调用以下方式在app/templates呈现模板:

 render template: 'default_theme/template', layout: 'default_theme/layout' 

使用template选项告诉rails不要使用控制器的名称附加路径。