Rails iPhone e iPad
Hoje fui agraciado pela empresa com a presença de um iPad em casa e claro a primeira coisa que fiz foi testar minhas aplicações nele. Logo percebi que não estava tudo certo, as aplicações respondem como se fosse um Iphone.
Isso pois a regra que tinha colocado era para responder a palavra “Mobile” e “Safari” e tanto iPhone como iPad respondem da mesma forma mas com poucos ajustes podemos resolver isto.
Primeiro vamos criar uma aplicação rails normal para testar esse reconhecimento.
rails new iphone_ipad
Agora criamos nossa home:
rails g controller home
rm public/index.html
No arquivo config/routes.rb colocamos nosso controller home como root da aplicação:
root :to => "home#index"
E alterar a linha para reconhecer controller e action com format
match ':controller(/:action(.:format))'
Repare que agora no rails 3 podemos indicar o controller e a action de forma bem mais simples. Declarando nossa action index no arquivo app/controllers/home_controller.rb
class HomeController < ApplicationController
def index
end
end
E a view em app/views/home/index.html.erb com o código:
<h1>Titulo Home</h1>
Tudo muito simples e fácil, agora temos que adicionar o reconhecimento de dispositivos móveis, no nosso caso iphone e ipad e para isso temos que olhar a propriedade do agente da requisição http.
Para isso funcionar vamos primeiro criar os mime types em config/initializers/mime_types.rb
Mime::Type.register_alias "text/html", :iphone
Mime::Type.register_alias "text/html", :ipad
E no controller adicionar os novos tipos de resposta:
class HomeController < ApplicationController
respond_to :html, :iphone, :ipad
def index
end
end
Agora precisamos criar a função para reconhecer os formatos em app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
protect_from_forgery
layout 'application'
before_filter :set_iphone_or_ipad_format
def set_iphone_or_ipad_format
format = is_iphone_or_ipad_request?
unless format.nil?
request.format = format
end
end
def is_iphone_or_ipad_request?
request.user_agent =~ /(iPhone|iPad).+Mobile\/.+Safari/
$1.downcase if $1
end
end
Explicando: Criamos um filtro para verificar a requisição de um ipad ou iphone pela expressão regular:
/(iPhone|iPad).+Mobile\/.+Safari/
Se encontrar a expressão o operador =~ seta a variável $1 com o resultado entre os parênteses e depois retornamos o texto em minúsculo.
Tudo pronto, só criar as views index.iphone.erb e index.ipad.erb na pasta app/views/home
O código do projeto está no github