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不要使用控制器的名称附加路径。