ActionView :: MissingTemplate:缺少模板(尝试渲染不存在:移动格式)

时间:2012-05-10 01:02:02

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个index.js,可以从桌面启动,但是当我尝试从Mobile Safari打开时出现以下错误。

ActionView::MissingTemplate: Missing template ads/thumbs/index, application/index with {:locale=>[:es, :en], :formats=>[:mobile], :handlers=>[:erb, :builder, :haml]}. Searched in: * "/app/app/views" * "/app/vendor/bundle/ruby/1.9.1/gems/devise-1.5.2/app/views" * "/app/app/views"

我不确定当文件夹中没有这样的文件时,为什么要查找:formats=>[:mobile]

尝试使用手机设备登录后发生同样的事情。我尝试渲染一个不存在的create.mobile.haml文件。

P.S。 Is there a way to make :mobile views to fallback default :html views when not found?那就可以了。

2 个答案:

答案 0 :(得分:0)

您通常应该回复内容类型特定的视图。在这种情况下,解决此短期问题的一种简单方法是将index.js重命名为index.mobile.js

Rails尝试呈现特定于所请求内容类型的视图 - 例如,请求html时为index.html.haml,或者如果请求json则为show.json.haml。在这种情况下,请求的内容类型为:mobile

从长远来看,您应该开发在请求不同内容类型时将发回的视图。

答案 1 :(得分:0)

这是一个简单的解决方案。

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

事实证明,Rails(3.2.11)已经为:js格式的请求添加了:html回退。这是ActionView::LookupContext#formats=

# Override formats= to expand ["*/*"] values and automatically
# add :html as fallback to :js.
def formats=(values)
  if values
    values.concat(default_formats) if values.delete "*/*"
    values << :html if values == [:js]
  end
  super(values)
end

因此,您可以自己覆盖#formats=,并且可以想象它不会比现有的Rails实现更糟糕。