В Sinatra, лучший способ служить расположению iPhone по сравнению с нормальным расположением?

Я пишу приложение 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

7
задан Doug 4 June 2010 в 22:10
поделиться

2 ответа

Вот что я в итоге сделал:

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
7
ответ дан 6 December 2019 в 21:10
поделиться

Я полагаю, что стандартный способ обработки конкретных пользовательских агентов в Sinatra - непосредственно в маршруте...

get '/', :agent => /iPhone/ do
    # render for iPhone
end

get '/' do
    # render standard layout
end

См. The Sinatra Book.

Что касается кэширования, я думаю, это зависит от того, какие слои кэширования используются на вашем сайте, но, да, вам может понадобиться учесть это.

4
ответ дан 6 December 2019 в 21:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: