关于Ruby on Rails的移动版视图的疑问?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我经过了一些验证,我正在做正确的事情。我有我的Ruby on Rails应用程序在以下结构中:

/home about.rhtml index.rhtml /display index.rhtml /data < - 由jQuery从display \ index页面调用以提供数据来呈现 push.js.erb pull.js.erb /layout home.rhtml display.rhtml

为此,我正在考虑为每个设备 /iPhone home.rhtml about.rhtml display.rhtml

但是,感觉好像很多数据会被复制,例如关于页面将会在两个地方。

我如何开发我的网站来支持这一点?

提问于
用户回答回答于

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

所以一个解决方案是:

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

有一些插件试图让这更容易:Mobile Fu和Rails iUI

你应该针对的:

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
用户回答回答于

Rails 4.1包含Variants。

在你的情况下,你只需要设置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

扫码关注云+社区