在Sinatra中支持手机WAP访问

2009-11-22 00:00 [sinatra] [ruby] [wap]


由于我的手机浏览器超烂,所以很少拿它上网。日前试了试访问我的网站,竟然把“节省”显示成“节剩”,真让人哭笑不得。昨天,给老婆买了个AnyCall,上网好用多了,但是在加载Google JS代码时老出错。索性,写了个Wap版的。

本打算专门用个域名m.7ge.cn,后来觉得没必要,还是动态检测一下比较好,如果是手机,就用WAP的Layout。

由于手机型号、版本及运营商的差别,检测起来也不是那么简单,参考了判断手机上网接入方法一文,暂时只检测HTTP_USER_AGENT和HTTP_VIA。

before do
  if request.user_agent.nil? || request.env['HTTP_VIA'] =~ /WAP/
    @is_wap = true
  end
end
get '/' do
  posts = Post.reverse_order(:created_at).limit(10)
	   
  if @is_wap
    erb :index_wap, :locals => {:posts => posts}, :layout => :layout_wap
  else
    comments = Comment.reverse_order(:created_at).limit(10)
    erb :index, :locals => { :posts => posts, :comments => comments }, :layout => false
  end
end

需要说明,layout参数一定需要是一个Hash(如上面的:layout_wap),否则不能正确显示。这种方法虽然不是最好的,但考虑改起来最简单,还是这样做了。WAP版的Layout如下:

<wml>
<head>
	<meta http-equiv="content-type" content="text/vnd.wap.wml; charset=utf-8" />
</head>
<card id="info" title="<%= Blog.title %>">
<h1><a href="/"><%= Blog.title %></a></h1>

<%= yield %>

</card>
</wml>


当然,我没有把所有页面都加上Wap支持,现在,就拿手机访问 7ge.cn 试试吧?

《大道至简》

七歌
微信公众号

七歌杜金房
微信视频号