Ruby on Rails的移动版本视图

时间:2009-08-16 12:14:09

标签: iphone ruby-on-rails windows-mobile mobile

我经过一些验证后说我做对了。我有以下结构中的Ruby on Rails应用程序:

/家
about.rhtml
index.rhtml里
/显示
index.rhtml里
/ data< - 这是由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

然而,感觉很多数据会被复制,例如,关于页面将在两个地方。我想我可以有一个局部并做一些像渲染:partial => '家/约',但这似乎有点hacky。

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

我在想一个像这样的结构,但又不知道如何构造代码 - 如何告诉它在iPhone目录中呈现视图...而没有应用主布局 /显示
/ iphone
index.rhtml里

我真的想要一些建议,以最好的方式来解决这个问题并构建应用程序。虽然应用程序目前遵循一种结构,但它们可能会朝不同的方向发展。

谢谢

4 个答案:

答案 0 :(得分:34)

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

一个优雅的解决方案是:

  1. 根据用户代理检测设备类型(您可能需要参考WURFL用户代理数据库);
  2. 使用Rails'respond_to机制为每种设备类型呈现不同的视图格式;
  3. 为每种设备类型定义布局(例如,为移动设备使用XHTML Mobile Profile doctype);
  4. 根据设备类型包含不同的CSS文件。
  5. 有一些插件试图让这更容易:看看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支持,但是他们可能不会想要网站的桌面版本,因为它可能无法工作。

答案 1 :(得分:9)

Rails 4.1包含变体,这是一项很棒的新功能:

  

允许您为相同的mime类型(例如,HTML)设置不同的模板和操作响应。对于任何为移动客户端提供服务的Rails应用程序而言,这是一个神奇的子弹。您现在可以拥有桌面,平板电脑和手机视图的各个模板,同时共享所有相同的控制器逻辑。

在您的情况下,您只需要在before_action中设置iphone的变体,例如:

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

答案 2 :(得分: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

干杯

答案 3 :(得分: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%的情况,解决方案应该“足够好”。