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.
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 minemobile.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.erbCreate a
before_filterin yourApplication_Controllerand do something to this effect.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.