Rails 5渲染位于'视图之外的模板。目录

时间:2016-10-16 01:03:13

标签: ruby-on-rails ruby-on-rails-5

以下代码

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的目录,所以它的工作原理就像以前的Rails版本一样吗?

2 个答案:

答案 0 :(得分:1)

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

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)
}

source

答案 1 :(得分:1)

首先附加视图路径:

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

然后,您可以通过调用:{/ p>在app/templates中呈现模板

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

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