2009-08-16 111 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