Rails head 里,将 meta 标签写成了 meat,导致在 iOS7 safari 里直接忽略后续标签 [已解决]

everpointer · 2014年05月17日 · 最后由 everpointer 回复于 2014年05月18日 · 3475 次阅读

用 Rails 4.1 做了个站,想支持手机访问,加载不同的 view。 看到了 Action Pack Variants, 通过他实现的 mobile 页面的加载。 但碰到了问题,第一次加载,页面能正常显示;但点击页面的连接的时候,新页面没有任何样式; 强制刷新一遍,样式才显示出来。

不知道是哪里除了问题,是 Action Pack Variants?Turbolinks? By the way, 在电脑上模拟 user agent 访问是没有问题的。

我的手机是 iPhone4, 系统是 iOS 7,不知道有关系不。

谁碰到过类似问题呀,求教。。

Update

标题已更新,因为跟之前提到的 Action Pack Variants 没有关系。

感谢@lolychee,根据他的提醒,原来是我在 head 里把 meta 标签写成了 meat,导致 safari 直接忽略 head 里的后续标签,最终导致了 css 和 js 的不加载。

不过凑巧的是,我的这个错误的 meat 标签,同时用到了一个在 iOS7 的 safari 里不再支持的标签 -- “apple-mobile-web-app-status-bar-style"。

关于“apple-mobile-web-app-status-bar-style"

Google 了一下,这个标签原本是用来更改 iOS 的状态栏的,但 iOS7 已经不支持这个标签了。

如果想修改 iOS7 的状态栏,可以参考(貌似比较麻烦): http://blogs.telerik.com/appbuilder/posts/13-11-07/everything-hybrid-web-apps-need-to-know-about-the-status-bar-in-ios7

过程总结

回顾了一下,碰到的这个问题可以算是简单,但是又很坑爹。要是没有社区的热心人,自己真的是毫无头绪。 看我的问题标题就知道了,跟 Action Pack Variants 半毛钱关系都没有。 要不是我贴了段

的代码,也许其他人也毫无头绪吧。

所以说,提问的方式真的很重要,特别是自己没把握的问题,贴环境,贴代码,会让问题得到更快的解决。

下次试试用 gist 贴代码,来辅助提问好了。

搞了一天了,早点提问就好了

#1 楼 @everpointer 这个问题提供的信息太少了,试试远程调试:http://www.leiphone.com/ios-safari-remote-debugging.html

#2 楼 @lyfi2003 对啦,想起来 safari 可以远程调试。不过下班途中,手机上着。不过感觉帮助不会太大,我看过后台日志,正常访问和强制刷新都回请求 js 和 css。点页面中的链接,就不加载了。目前知识水平想不出什么原因,不过远程调试还是可以一试,3Q。

至少我用没发现问题……你可以试试访问http://bdfzer.com 看看是不是手机视图…… 源码:https://github.com/cassiuschen/bdfzer-sso/tree/feature/mobile/app/views/layouts

#4 楼 @cassiuschen 只能看到登录页呀,不过源码可以参考下。我用的是 ratchet-sass,你用的是 ionic 呀,不过貌似不支持 iOS6 以下,所以没用。

#4 楼 @cassiuschen 我是在开发环境下,用手机局域网访问发生问题了。真不行,找个生产环境,放下看看有没有问题。

#5 楼 @everpointer 我觉得和环境没关系………你有没有写什么奇怪的代码比如 ua 包含 iPhone 就自动算 phone 什么的…我之前那么写然后就通不过…删了反而 ok 了…

#7 楼 @cassiuschen 就是这么写的,有什么问题吗。。

#7 楼 @cassiuschen 又看了下你的代码,貌似 mobile 和 desktop 采用了不用的 layout 名字,而不是 application.html.slim 和 application.html+phone.slim. 而我则是采用相同前缀的 application layout,如果你的能够 work, 那问题可能就是出在这里。 我等下试试去。 摘抄你的 application_controller.rb 中的代码:

class ApplicationController < ActionController::Base
  #...
  before_action :check_phone
  layout :to_phone
  #...
  def check_phone
    request.variant = :phone if !!(request.user_agent =~ /iPhone/)
  end

  def to_phone
    if request.variant == :phone
      'layouts/ionic'
    else
      'layouts/application'
    end
  end
end

#9 楼 @everpointer 这段代码起作用了么?因为 feature 没开发完所以冗余代码我好像没删……我好像记得这么搞没用…

#10 楼 @cassiuschen 回家不久,还在试,之前发的时候只是匆匆瞥了下代码。听到没用,心凉了,继续试下。不过你说的你删了 ua, 是在哪啊,mobile 和 desktop 请求区分,你最终是咋处理的呢?

#11 楼 @everpointer 那个请求区分实际上 rails 自己已经做好了,不用手动写。application_controller里面的那个:to_phone 最终没起作用,我目前都只是在 layout 里创建*.html+phone.*,然后 rails 默认就渲染了…

#12 楼 @cassiuschen 好吧,我本来就是这么做的,:to_phone 的确没起作用,看来问题不是出在这里了,还得另谋出路了。

这会开了 safari 远程调试,发现点击链接出现的无样式页面,

里没有 css 和 js 标签。 下面是我的 layout 里 head 的 haml 代码 和 实际生成的 html 代码,好奇怪呀。
%head
    %title= full_title(yield(:title))
    %meta{"charset" => "utf-8"}
    %meta{"name" => "viewport", "content" => "initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui"}
    %meta{"name" => "apple-mobile-web-app-capable", "content" => "yes"}
    %meat{"name" => "apple-mobile-web-app-status-bar-style", "content" => "blank"}
    = stylesheet_link_tag "phone_application", media: "all", "data-turbolinks-track" => true
    = javascript_include_tag "phone_application", "data-turbolinks-track" => true    
    = csrf_meta_tags
<head>
    <title>Rails Commerce</title>
    <meta charset="utf-8">
    <meta content="initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui" name="viewport">
    <meta content="yes" name="apple-mobile-web-app-capable">
    <style id="holderjs-style" type="text/css"></style>
</head>
%meat{"name" => "apple-mobile-web-app-status-bar-style", "content" => "blank"}

一行行对比就能发现从这里开始不正常了

#15 楼 @lolychee 头部代码是 copy 的,也会有问题,根本没想到这一块,去掉试试。

#15 楼 @lolychee 去除了“apple-mobile-web-app-status-bar-style”这个 meta tag 之后,everything works fine again!

原来是我把 meta 标签写成了 meat,导致 safari 直接忽略了 head 里的后续标签,最终导致 css 和 js 的不加载。

至于“apple-mobile-web-app-status-bar-style”,Google 了一下,原来 iOS7 已经不支持这个标签了。

这个标签的主要功能是更改状态栏的,反正我也不需要改,去除就去除吧。

贴一个关于 iOS7 关于修改状态栏的文章,有需要的人可以参考: http://blogs.telerik.com/appbuilder/posts/13-11-07/everything-hybrid-web-apps-need-to-know-about-the-status-bar-in-ios7

#17 楼 @everpointer 不对不对 你没找到重点

%meat

#18 楼 @lolychee 啊,完了丢人了,原来是我标签写错了呀,我太马大哈了。

不过好凑巧啊,“apple-mobile-web-app-status-bar-style”的确是不生效了;不过页面渲染异常, 却是我把 meta 标签写成了 meat。

还写了那么多话,误认子弟,都不知道从哪删起了。。

By the way,

里写错个标签,直接给我这么怪的异常,safari 我恨你。
hlcfan 帖子右侧 节点下其他话题 下出现原帖 提及了此话题。 04月03日 10:57
需要 登录 后方可回复, 如果你还没有账号请 注册新账号