用于查找视图的解析模式只能包含在ActionView::LookupContext 类中注册的变量。因此,第一步是向LookupContext 类注册一个新变量(subdomain)。您应该在初始化程序中执行此操作:
ActionView::LookupContext.register_detail(:subdomain) do
['default_subdomain']
end
现在LookupContext 知道subdomain,它可以包含在解析模式中。有关更改解析模式的更多详细信息,请参阅ActionView::FileSystemResolver documentation,但基本上您应该在初始化程序中包含以下内容:
ActionController::Base.view_paths = ActionView::FileSystemResolver.new(
Rails.root.join('app', 'views'),
':prefix/:action{.:locale,}{.:subdomain,}{.:formats,}{.:handlers,}'
)
这个模式最终被传递给Dir.glob(在:*变量被替换之后)。 glob 模式{.:subdomain,} 表示“要么.:subdomain 要么什么都没有”,如果找不到具有子域的文件,它会提供回退到没有子域的视图文件。
最后一步是更新您的ApplicationController 以将子域传递给LookupContext:
class ApplicationController < ActionController::Base
def details_for_lookup
{:subdomain => [request.subdomain]}
end
end
(这个答案主要是通过阅读源代码得出的,其中一些功能没有记录。它是用 Rails 3.2.5 测试的)