移动mime类型可以回退到Rails中的"html"吗?

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"的别名,因此它似乎并不太牵强.

那么,有几个问题:

  1. 我做错了吗?或者,有更好的方法吗?
  2. 如果没有,如果移动设备或平板电脑文件不存在,我可以将移动设备和平板电脑的mime类型重新设置为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)

完成后,如果移动设备位于移动设备上,您的文件将默认为移动视图,如果移动设备不存在,则会回退到常规模板.

  • 我一年前提出的问题怎么可能是一个月前提出的问题的可能重复?另外,请注意原始问题中Rails 3.0.1是当前版本.尽管如此,这看起来像是Rails 3.1的可行解决方案. (4认同)