2011-10-07 120 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 

这确实看起来很优雅,除了在实践中,我发现我很少将它用于移动网站。我一直在努力的移动网站通常与“完整”网站完全不同。在这些情况下,在“移动”命名空间下定义另一组控制器是有意义的。