Rails视图文件名中的自定义变量

use*_*595 5 ruby-on-rails actionview

默认情况下,Rails可以在文件名中找到格式,区域设置和模板语言的视图(所以我可以创建index.de.json.erb)

是否可以在视图的文件名中添加另一个自定义参数?

我想传递当前的子域,因此http://foo.example.com/将呈现index.foo.html.erb,http://bar.example.com/并将呈现index.bar.html.erb(两者都具有index.html.erb回退).

geo*_*ock 9

用于查找视图的解析模式只能包含在ActionView::LookupContext类中注册的变量.因此,第一步是subdomainLookupContext类中注册一个新的变量().你应该在初始化器中执行此操作:

ActionView::LookupContext.register_detail(:subdomain) do
  ['default_subdomain']
end
Run Code Online (Sandbox Code Playgroud)

现在LookupContext知道了subdomain,它可以包含在解析模式中.有关更改解析模式的更多详细信息,请参阅ActionView::FileSystemResolver文档,但基本上您应该在初始化程序中包含以下内容:

ActionController::Base.view_paths = ActionView::FileSystemResolver.new(
  Rails.root.join('app', 'views'),
  ':prefix/:action{.:locale,}{.:subdomain,}{.:formats,}{.:handlers,}'
)
Run Code Online (Sandbox Code Playgroud)

最终将此模式传递给Dir.glob(在:*替换变量之后).glob模式{.:subdomain,}意味着"无论是否.:subdomain",如果找不到具有子域的文件,它将为没有子域的视图文件提供回退.

最后一步是更新您ApplicationController的子域名到LookupContext:

class ApplicationController < ActionController::Base
  def details_for_lookup
    {:subdomain => [request.subdomain]}
  end
end
Run Code Online (Sandbox Code Playgroud)

(这个答案主要通过阅读源代码来解决,其中一些功能没有记录.它是用Rails 3.2.5测试的)