我在想如何去创建一个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“> –