Rails 3如果未命中模板,则指定回退格式



我有一个rails 3.2应用程序,最近我向其中添加了mobile fu gem,以便添加单独的移动视图
虽然有一些小问题,但在大多数情况下,它非常有效。

然而,我只创建了少数页面的移动视图。当我试图从移动设备转到没有移动视图的页面时,我会得到:

Missing template after_hour_it_supports/index, application/index with {:locale=>[:en], :formats=>[:mobile], :handlers=>[:erb, :builder, :prawn, :prawn_dsl]}

这正是我所期望的。

然而,有必要显示一些可能永远不会有移动对应的页面。具体来说,有一个页面可以批准某些内容。他们正在审批的东西可能永远不会有移动视图,但审批页面已经有了移动视图。我目前的方法是使用iframe来显示可能的非移动视图。当然,如果存在移动视图,我更愿意使用它而不是非移动视图(仍在iframe中)。

因此,我想做的是尝试用:mobile格式渲染模板,但如果mobile格式不存在,则用:html格式渲染,这似乎是rails基于MissingTemplate异常中提到的:formats数组已经做过的事情。我可以找到一些关于如何在调用render时设置:formats数组的文档,但我希望自动执行此操作,而不必修改每个现有的响应。

如何在应用程序级别上将:formats=>[:mobile]修改为:formats=>[:mobile, :html]

我终于找到了一个似乎对我有用的答案(Will Madden的答案)。

具体来说,我使用了他的建议来覆盖ApplicationController中的formats=。他说,rails已经为:js格式添加了完全相同的功能。

他在回答中写的具体方法如下:

class ApplicationController
    ...
    def formats=(values)
        values << :html if values == [:mobile]
        super(values)
    end
    ...
end

这是迄今为止我为自己的处境找到的最优雅的解决方案。但是,只要有问题的页面的控制器包含当前操作的respons_to块,它就会失败。

最新更新