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

blog comments powered by Disqus