2011-10-07 138 views
4

我在想如何去創建一個Rails 3.0應用程序的移動版本。Rails 3.0手機網站

我看到這個帖子:Mobile version of views for Ruby on Rails

但我在的respond_to方法困惑。該方法如何知道要呈現哪種格式?

我會在我的應用程序控制器中創建一個方法來呈現移動佈局,然後爲每個視圖使用respond_to方法嗎?

謝謝

布賴恩

+0

不要忘記添加XHTML移動DTD <!DOCTYPE HTML PUBLIC 「 - // WAPFORUM // DTD XHTML 1.2的移動// EN」 「HTTP! //www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd「> –

回答

1

看一看Rails Mobile

我已經開發了插件而回。該插件背後的想法是,您可以通過路由器配置文件,根據您的移動設備功能重定向到不同的控制器或視圖。

在routing.rb的末尾添加這些行:

MobileDispatch::Categories.add do 

def mobile_classifier(device) 
    "_mobile" 
end 
end 

這些行定義爲將被存儲在$變量在rouging.rb文件中的每個請求的所有移動設備的一個新的子串。

這樣你就可以玩你的路由規則。例如,這行routing.rb:

匹配 '/照片/:ID',:到=> 「照片#指數$」,:分類器=>:mobile_classifier

對於普通用戶將被解釋爲:

匹配 '/照片/:ID',:到=> 「照片#指數」,:分類器=>:mobile_classifier

而對於移動用戶爲:

匹配「/照片/:id',:to =>「photo#index_mobile」,:classifier =>:mobile_classifier

此處的權力位於mobile_classifier(device)方法中,您可以根據設備對象返回不同的分類。

所以我們說,我們修改該方法返回的所有iPhone設備「_iphone」和「_android」的所有Android手機,那麼上面的路由線路將被解釋爲:

匹配「/照片/:ID 」,:到=> 「照片#index_iphone」:分類器=>:mobile_classifier

匹配 '/照片/:ID',:到=> 「照片#index_android」:分類器=>:mobile_classifier

如果您將$添加到每個路徑的視圖結束部分(類似於我們在此處所做的操作),則您將在控制器中爲每種類型的設備獲得不同的方法,每個方法的視圖名稱(index_iphone.htm.erb和index_android.ht.erb)通過這種方式,您可以爲您在mobile_classifier方法中定義的每個設備類別提供單獨的視圖/圖層。

+0

因此,如果使用該插件,應用程序仍然會調用該方法,但是如果請求來自移動設備,則會呈現移動視圖?它會自動檢測移動設備嗎?這個插件支持哪些移動設備? – Brian

+0

對不起,還有移動版面呢?有沒有辦法使用這個插件渲染移動佈局,或者我只是添加一個方法到我的應用程序控制器? – Brian

+0

對不起,我沒有看到你的第二個問題。請檢查我的更新回答 – Reza

2

respond_to方法將根據當前請求的MIME類型進行選擇。

這對常見的MIME類型開箱即用,但您需要告訴您的應用程序有關您的自定義類型。在您的應用程序控制器中,您需要定義一種方法來調整Rails內部重新呈現請求的格式。然後,將該方法稱爲before過濾器。這裏有一個例子:

class ApplicationController < ActionController::Base 
    before_filter :adjust_for_mobile 

    def adjust_for_mobile 
    request.format = :mobile if mobile_request 
    end 

    # You'll also need to define the mobile_request method 
    # using whatever strategy you want to tell if a request 
    # is from a mobile client or not 
    def mobile_request 
    true 
    end 
end 

確保你定義這個新類型的配置/初始化/ mime_types.rb:

Mime::Type.register "text/html", :mobile 

然後,在你的控制器,你就可以使用'mobile'格式:

class FoosController < ApplicationController 
    def index 
    @foos = Foo.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.mobile # index.mobile.erb 
    end 
    end 
end 

這確實看起來很優雅,除了在實踐中,我發現我很少將它用於移動網站。我一直在努力的移動網站通常與「完整」網站完全不同。在這些情況下,在「移動」命名空間下定義另一組控制器是有意義的。