Mobile Fu
Want to automatically detect mobile devices that access your Rails application?
Mobile Fu allows you to do just that. People can access your site from a Palm, Blackberry, iPhone, iPad, Nokia, etc. and it will automatically adjust the format of the request from :html to :mobile.
Rails 3 Compatibility
This is a fork of brendanlim’s mobile-fu that incorporates railties as well as several other tweaks.
Usage
Add this this one line to the controller.
class ApplicationController < ActionController::Base
has_mobile_fu
end
Once this is in place, any request that comes from a mobile device will be be set as :mobile format. It is up to you to determine how you want to handle these requests. It is also up to you to create the .mobile.erb versions of your views that are to be requested.
Then add the line below to config/initializers/mime_types.rb
Mime::Type.register_alias "text/html", :mobile
If you don’t want EVERY request to automatically be converted to :mobile if the device is mobile, you can enable the plugin with:
class ApplicationController < ActionController::Base
enable_mobile_fu
end
And then in the controller that has mobile views you do:
class WhateverController < ApplicationController
before_filter :set_mobile_format
end
If you want “test mode”, or to always see the mobile view use:
class WhateverController < ApplicationController
before_filter :force_mobile_format
end
I recommend that you setup a before_filter that will redirect to a specific page depending on whether or not it is a mobile request. How can you check this?
is_mobile_device? # => Returns true or false depending on the device
You can also determine which format is currently set in by calling the following:
in_mobile_view? # => Returns true or false depending on current req. format
Also, if you want the ability to allow a user to switch between ‘mobile’ and ‘standard’ format (:html), you can just adjust the mobile_view session variable in a custom controller action.
session[:mobile_view] # => Set to true if request format is :mobile and false
if set to :html
So, different devices need different styling. Don’t worry, we’ve got this baked in to Mobile Fu.
If you are including a css or sass file via stylesheet_link_tag, all you have to do is add _device to the name of one of your files to override your styling for a certain device. The stylesheet that is loaded is dependant on which device is making the request.
e.g., Accessing a page from a Blackberry.
... stylesheet_link_tag 'mobile.css' ...
This loads mobile.css, and mobile_blackberry.css if the file exists.
Supported stylesheet override device extensions at the moment are:
blackberry
iphone (iphone,ipod)
ipad
android
mobileexplorer
nokia
palm
The stylesheet awesomeness was derived from Michael Bleigh’s browserized styles: www.intridea.com/2007/12/9/announcing-browserized-styles
Inspiration for Mobile Fu came from Noel Rappin’s rails_iui: blogs.pathf.com/agileajax/2008/05/rails-developme.html
Hopefully this should help you create some awesome mobile applications.
Testing Mobile Interface
If you want to force the mobile interface for testing, you can either use a mobile device emulator, or you can pass ‘true’ to has_mobile_fu.
class ApplicationController < ActionController::Base
has_mobile_fu(true)
end
Copyright © 2008 Brendan G. Lim, Intridea, Inc., released under the MIT license