Rails 3如果MissingTemplate指定回退格式

时间:2014-10-29 14:40:26

标签: ruby-on-rails mobile-fu

我有一个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格式渲染模板,但如果移动格式不存在,则使用:html格式进行渲染,这似乎是rails已基于{ MissingTemplate异常中提到的{1}}数组。我可以找到一些关于如何在调用render时设置:formats数组的文档,但我想自动执行此操作,而不必修改每个现有的响应。

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

1 个答案:

答案 0 :(得分:0)

我终于找到了answer似乎对我有用(Will Madden的回答)。

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

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

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

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