2009-08-16 104 views
15

我经过一些验证,我做的是正确的事情。我有我的Ruby on下面的结构Rails应用程序:Ruby on Rails的移动版视图

/家
      about.rhtml
      index.rhtml里
/显示
      index.rhtml里
/数据< - 这是由jQuery从display \ index页面调用以提供要渲染的数据
   现在push.js.erb
      pull.js.erb
/布局
      home.rhtml
      display.rhtml

一切工作正常,但我想要添加针对移动设备的网站。当iPhone正确呈现网站时,提供更有针对性的体验将会很不错。理想情况下,我正在考虑通过.htaccess重定向到iPhone.domain.com。

对于这一点,我在想增加另一视图为每个设备
/iPhone
      home.rhtml
      about.rhtml
      display.rhtml

但是,感觉好像很多数据会被复制,例如关于页面将会在两个地方。我想我可以有一个部分,并做一些像render:partial =>'home/about',但这看起来有点冒失。

如何开发我的网站以支持此功能?

我正在考虑如何构造结构,但又不知道如何构造代码 - 如何告诉它如何在iPhone目录中呈现视图...而没有应用主布局
/display
     /iphone
            index.rhtml里

我真的很想上解决这个和构建应用程序的最佳途径一些建议。虽然应用程序都遵循一个结构上的那一刻,他们可以在不同的方向走下车..

谢谢

回答

33

我强烈建议在所有设备类型中保留相同的控制器结构。特别是如果您使用Rails的RESTful路由,您的控制器应该与数据的域模型紧密匹配。然后,这些数据是否呈现给桌面浏览器,iPhone,不同类型的移动设备,JSON/XML REST API客户端等,主要是表示层,而不是控制器/路由层。

因此,一个优雅的解决方案是:

  1. 检测基于用户代理的设备类型(您可能要参考WURFL用户代理数据库);
  2. 使用Rails的respond_to机制为每种设备类型呈现不同的视图格式;
  3. 定义了每种设备类型的布局(例如,使用移动设备的XHTML Mobile Profile文档类型);
  4. 根据设备类型包含不同的CSS文件。

有一些插件试图使这更容易:看看brendanlim的Mobile Fu和noelrappin的Rails iUI(都在GitHub上)。另外Brendan Lim's presentation at Rails Underground有几个想法。

你应该瞄准什么是一样的东西:

def show 
    @foo = Foo.find(params[:id]) 
    respond_to do |format| 
    format.html  # => show.html.erb 
    format.iphone  # => show.iphone.erb 
    format.blackberry # => show.blackberry.erb 
    end 
end 

你也应该允许移动设备上的用户覆盖用户代理检测,如果他们真的想看看该网站的桌面版本。有一个很长的到期时间的cookie可能是这样做的最好方法,以便该网站在下次用户返回时记住该选择。一些移动设备具有垃圾cookie支持,但是他们可能不会想要站点的桌面版本,因为它可能不起作用。

+5

两个轨的iUI和移动福似乎并没有被更新有一段时间没有适当的Rails 3支持。在Rails中处理手机的最新方式是什么? – thermans 2011-06-15 16:13:29

+0

我一直在使用这个mobile_fu宝石的叉子:https://github.com/benlangfeld/mobile-fu 2个月前更新,适合我的需求。 – DemitryT 2012-08-21 14:01:20

0

首先,你应该使用的.html。erb作为您的模板扩展名

其次,您可以使用逻辑来检测基于用户代理(request.user_agent)使用的布局类型。

layout :site_layout 

def site_layout 
    some_way_to_detect_the_layout_to_use 
end 

注意,USER_AGENT可以伪造的,但大多数人不会打扰弄虚作假,因此该解决方案应该是“足够好”的病例的99.9%。

1

Iphone实际上在渲染网页时没有任何特殊的格式。

但是,在我的Android手机上,浮动内容似乎被切断,因此需要为该手机设置自定义视图。 要做到这一点,你需要创建一个不同的布局(如mobile_application.html.erb),并且在application_controller添加以下内容:

layout :select_layout 

    def select_layout 
    session.inspect # force session load 
    if session.has_key? "layout" 
     return (session["layout"] == "mobile") ? "mobile_application" : "application" 
    end 
    return detect_browser 
    end 

    def detect_browser 
    agent = request.headers["HTTP_USER_AGENT"].downcase 
    MOBILE_BROWSERS.each do |m| 
     return "mobile_application" if agent.match(m) 
    end 
    return "application" 
    end 

其中MOBILE_BROWSERS是要匹配的一个的用户代理字符串数组移动设备。

我写了一篇博客这个位置:

http://www.arctickiwi.com/blog/2-mobile-enable-your-ruby-on-rails-site-for-small-screens

干杯

9

Rails 4.1包括变种,一个伟大的新功能:

可让您在不同的模板并为相同的MIME类型(比如说HTML)提供动作响应。对于任何为移动客户端提供服务的Rails应用程序,这是一个神奇的项目。您现在可以在共享所有相同的控制器逻辑的同时拥有桌面,平板电脑和手机视图的单独模板。

在你的情况,你只需要设置为iPhone的变种在before_action,如:

class HomeController < ApplicationController 
    before_action :detect_iphone 
    def index 

    respond_to do |format| 
     format.html    # /app/views/home/index.html.erb 
     format.html.phone   # /app/views/home/index.html+phone.erb 
    end 
    end 

    private 
    def detect_iphone 
     request.variant = :iphone if request.user_agent =~ /iPhone/ 
    end 
end 

What's new in Rails 4.1