我该如何拦截Rails的模板渲染?

4

我有一个应用程序,可以为多个网站提供服务。类似于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的UsersController#index时,它会意识到没有index.html.erb模板,因此在引发缺少模板错误之前检查shared/users/index.html.erb。
提前感谢。
2个回答

8

我知道你已经接受了一个答案,但我认为你不需要创建自己的模板解析器。

如果我正确理解了你的问题,你正在尝试根据应用程序当前状态的某些方面来“主题化”你的视图。我以前也使用过这个小控制器方法来完成同样的事情:

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

现在,当请求“/users”时,Rails会首先查找“app1”的当前应用程序中的“app/views/app1/users/index.html.erb”。如果在那里找不到,它会回滚到默认位置“app/views/users/index.html.erb”。希望这给你提供了另一个选择。

1
请注意,“current_app_code”是您必须创建的内容。我只是用它作为一个例子。 - twmills
你好谢谢建议。我不确定这会奏效,因为默认位置不仅是/views/users,而是views/shared/users。 - bodacious
1
该方法接受一个数组:prepend_view_path(["views/default", "views/custom"]) - twmills
我仍然无法让它正常工作。这个方法发送当前路径前缀(例如:app1/users/)。使用这种方法,它会寻找/views/shared/app1/users而不是/views/shared/users。我必须删除当前前缀“app1”,这就是我在我的解析器中所做的。 - bodacious
原来我不需要在这里编写自己的解析器...谢谢! - bodacious
哇,我读了这个答案,但没有仔细阅读。如果它在那里找不到,它会回滚到默认位置“app/views/users/index.html.erb”。太棒了!我自己花了半个小时试图做到这一点。 - Tyler Collier

2

我相信你需要编写自己的模板解析器。也许这篇博客文章可以帮助你。


我最初选择了别名方法链接渲染方法,但这似乎不太耗费资源! :) - bodacious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接