Я пишу приложение Sinatra, которое должно представить различные разметки на основе того, использует ли пользователь iPhone или регулярный браузер. Я могу обнаружить тип браузера с помощью Rack-Mobile-Detect, но я не уверен в лучшем способе сказать Sinatra который расположение использовать.
Кроме того, у меня есть чувство, что, как я принимаю решение сделать, это может также повредить кэширование страницы. Это верно?
require 'sinatra/base'
require 'haml'
require 'rack/mobile-detect'
class Orca < Sinatra::Base
use Rack::MobileDetect
helpers do
def choose_layout
if request.env['X_MOBILE_DEVICE'] == :iPhone
# use iPhone layout
else
# use normal layout
end
end
end
before do
# should I use a before filter?
choose_layout()
end
get '/' do
haml :home # with proper layout
end
end #Class Orca
Вот что я в итоге сделал:
require 'sinatra/base'
require 'haml'
require 'rack/mobile-detect'
class Orca < Sinatra::Base
use Rack::MobileDetect
# HAML template options
# Use HTML5 doctype
set :haml, {:format => :html5 }
helpers do
def get_layout
# For AJAX (XMLHttpRequest) requests, don't use a layout
if request.xhr? then
@layout = false
exit
end
# For non-AJAX (XMLHttpRequest) requests, choose correct layout
# For each mobile device, you will need a layout_<device>.haml file
# in the Views directory
@layout = case request.env['X_MOBILE_DEVICE']
when /iPhone|iPod/ then :layout_iphone
# when "Android" then :layout_android
else true # use default Sinatra layout
end
end
end # helpers
before do
get_layout()
end # before filter
get '/' do
# Will use iPhone layout for iPhone|iPod,
# Sinatra default layout for desktop browsers
haml :home, :layout => @layout
end
end # Class
Я полагаю, что стандартный способ обработки конкретных пользовательских агентов в Sinatra - непосредственно в маршруте...
get '/', :agent => /iPhone/ do
# render for iPhone
end
get '/' do
# render standard layout
end
См. The Sinatra Book.
Что касается кэширования, я думаю, это зависит от того, какие слои кэширования используются на вашем сайте, но, да, вам может понадобиться учесть это.