我在想如何去創建一個Rails 3.0應用程序的移動版本。Rails 3.0手機網站
我看到這個帖子:Mobile version of views for Ruby on Rails
但我在的respond_to方法困惑。該方法如何知道要呈現哪種格式?
我會在我的應用程序控制器中創建一個方法來呈現移動佈局,然後爲每個視圖使用respond_to方法嗎?
謝謝
布賴恩
我在想如何去創建一個Rails 3.0應用程序的移動版本。Rails 3.0手機網站
我看到這個帖子:Mobile version of views for Ruby on Rails
但我在的respond_to方法困惑。該方法如何知道要呈現哪種格式?
我會在我的應用程序控制器中創建一個方法來呈現移動佈局,然後爲每個視圖使用respond_to方法嗎?
謝謝
布賴恩
看一看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方法中定義的每個設備類別提供單獨的視圖/圖層。
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
這確實看起來很優雅,除了在實踐中,我發現我很少將它用於移動網站。我一直在努力的移動網站通常與「完整」網站完全不同。在這些情況下,在「移動」命名空間下定義另一組控制器是有意義的。
不要忘記添加XHTML移動DTD <!DOCTYPE HTML PUBLIC 「 - // WAPFORUM // DTD XHTML 1.2的移動// EN」 「HTTP! //www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd「> –