mar*_*ada 22 mobile ruby-on-rails ruby-on-rails-3
我在ApplicationController中使用此代码(取自此处)来检测iPhone,iPod Touch和iPad请求:
before_filter :detect_mobile_request, :detect_tablet_request
protected
def detect_mobile_request
request.format = :mobile if mobile_request?
end
def mobile_request?
#request.subdomains.first == 'm'
request.user_agent =~ /iPhone/ || request.user_agent =~ /iPod/
end
def detect_tablet_request
request.format = :tablet if tablet_request?
end
def tablet_request?
#request.subdomains.first == 't'
request.user_agent =~ /iPad/
end
Run Code Online (Sandbox Code Playgroud)
这允许我有像show.html.erb,show.mobile.erb和show.tablet.erb这样的模板,这很好,但是有一个问题:似乎我必须为每个mime类型定义每个模板.例如,即使定义了show.html.erb,在不定义show.mobile.erb的情况下从iPhone请求"show"操作也会引发错误.如果缺少移动设备或平板电脑模板,我只想简单地使用html设备.由于"mobile"被定义为mime_types.rb中"text/html"的别名,因此它似乎并不太牵强.
那么,有几个问题:
如果重要,我正在使用Rails 3.0.1.提前感谢任何指针.
编辑:我忘了提到的东西:我最终会转移到单独的子域(正如你在我的例子中看到的那样),所以模板加载确实需要自动发生,无论哪个before_filter
运行.
Jus*_*ick 17
rails 3.1中可能重复更改视图格式(提供移动html格式,在普通html上回退)
然而,我遇到了这个完全相同的问题,并提出了一个相当优雅的解决方案,完美地满足了我的需求.这是我在另一篇文章中的回答.
我想我找到了最好的方法.我正在尝试与你相同的东西,但后来我记得在rails 3.1中引入了模板继承,这正是我们需要这样的东西才能工作的东西.我真的不能为这个实现付出太多的荣誉,因为它全部都是由Ryan Bates在railscasts链接中提出的.
所以这基本上就是这样.
在中创建一个子目录app/views
.我标记了我的mobile
.
将要覆盖的所有视图模板嵌套在与它们在views目录中相同的结构格式中. views/posts/index.html.erb -> views/mobile/posts/index.html.erb
before_filter
在你的作品中创造一个Application_Controller
并为此效果.
before_filter :prep_mobile
def is_mobile?
request.user_agent =~ /Mobile|webOS|iPhone/
end
def prep_mobile
prepend_view_path "app/views/mobile" if is_mobile?
end
Run Code Online (Sandbox Code Playgroud)
完成后,如果移动设备位于移动设备上,您的文件将默认为移动视图,如果移动设备不存在,则会回退到常规模板.
归档时间: |
|
查看次数: |
6871 次 |
最近记录: |