Can a mobile mime type fall back to "html" in Rails?

mobile, ruby-on-rails, ruby-on-rails-3

Solution

Possible Duplicate of Changing view formats in rails 3.1 (delivering mobile html formats, fallback on normal html)

However, I struggled with this exact same problem and came up with a fairly elegant solution that met my needs perfectly. Here is my answer from the other post.

I think I've found the best way to do this. I was attempting the same thing that you were, but then I remembered that in rails 3.1 introduced template inheritance, which is exactly what we need for something like this to work. I really can't take much credit for this implementation as its all laid out there in that railscasts link by Ryan Bates.

So this is basically how it goes.

Create a subdirectory in `app/views`. I labeled mine `mobile`.

Nest all view templates you want to override in the same structure format that they would be in the views directory. `views/posts/index.html.erb -> views/mobile/posts/index.html.erb`

Create a `before_filter` in your `Application_Controller` and do something to this effect.

 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

Once thats done, your files will default to the mobile views if they are on a mobile device and fallback to the regular templates if a mobile one is not present.

Problem

I'm using this code (taken from here) in ApplicationController to detect iPhone, iPod Touch and iPad requests: ``` 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 ``` This allows me to have templates like show.html.erb, show.mobile.erb, and show.tablet.erb, which is great, but there's a problem: It seems I must define every template for each mime type. For example, requesting the "show" action from an iPhone without defining show.mobile.erb will throw an error even if show.html.erb is defined. If a mobile or tablet template is missing, I'd like to simply fall back on the html one. It doesn't seem too far fetched since "mobile" is defined as an alias to "text/html" in mime_types.rb. So, a few questions: - Am I doing this wrong? Or, is there a better way to do this? - If not, can I get the mobile and tablet mime types to fall back on html if a mobile or tablet file is not present? If it matters, I'm using Rails 3.0.1. Thanks in advance for any pointers. EDIT: Something I forgot to mention: I'll eventually be moving to separate sub-domains (as you can see commented out in my example) so the template loading really needs to happen automatically regardless of which `before_filter` has run.

Original source

Related problems