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回退).
用于查找视图的解析模式只能包含在ActionView::LookupContext类中注册的变量.因此,第一步是subdomain在LookupContext类中注册一个新的变量().你应该在初始化器中执行此操作:
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测试的)