我有一个应用程序服务于多个网站。与Stack Exchange类似,这几个站点的行为非常相似。
给定以下视图目录结构:
views/
shared/users/index.html.erb
app1/users/index.html.erb
app2/users/
如何在 Rails 中重写默认模板渲染,以便
- 当调用 App1 的 UsersController#index 时,它会呈现 app1/users/index.html.erb
- 当调用 App2 的用户控制器#索引时,它意识到没有 index.html.erb 模板,因此在引发缺少模板错误之前检查共享/用户/索引.html.erb
提前致谢
我知道您已经接受了这个问题的答案,但我认为您不需要创建自己的模板解析器。
如果我正确理解了您的问题,那么您正在尝试根据应用程序当前状态的某些方面来"主题"您的观点。我以前使用这个花花公子的小控制器方法做过同样的事情:
prepend_view_path "app/views/#{current_app_code}"
把它放在应用程序控制器的before_filter中,所有控制器都会服从:
class ApplicationController < ActionController::Base
before_filter :prepend_view_paths
def prepend_view_paths
prepend_view_path "app/views/#{current_app_code}"
end
end
现在,如果"app1"是当前应用程序,则当请求"/users"时,rails 将首先查找"app/views/app1/users/index.html.erb"。
如果在那里找不到它,它会回滚到"app/views/users/index.html.erb"的默认位置。
希望这能给你另一种选择。
你必须编写自己的模板解析器。也许这篇博文可以提供帮助。