Rails 2.0: Views, As You Like Them

Макар да ми се е налагало сравнително рядко, писането на алтернативна версия на дадена web-страница не е от най-интересните занимания. Причините, които налагат използването на алтернативни версии, обаче, са не една и две – на пазара отдавна съществуват плеяда мобилни устройства с възможност за достъп до мрежата, а появата на по-сериозни играчи от рода на N-сериите на Nokia или iPhone (sux!) на Apple са предпоставка за оптимизация на сайтовете, борещи се за повечко потребителско внимание.

Старите версии на Rails разполагаха с възможност да отговарят с различни версии на дадена страница, в зависимост от заявеният файлов формат, и всъщност вършеха голяма част от работата. Макар и полезно за cross-site scripting, съществуващото досега решение не беше в състояние да се справи с различни версии на файлове от един и същи формат – иначе казано: можехте да отговаряте с различни файлове ако се извика products или products.xml, но не можехте да имате две версии на products, зависими от типа на клиентите. Да, имаше възможност за добавяне на нови handler-и за файловите формати чрез добавяне на MIME::Type.register-инструкции във файла environment.rb, но добавянето на нов handler презаписваше старата асоциация, оставяйки Ви в небрано лозе.

Явно разработчиците на Rails са помислили повечко по въпроса и в config директорията на всяко приложение вече разполагате с чисто нов конфигурационен файл на име /config/initializers/mime_types.rb. В него можете да добавяте alias-и за всеки файлов формат, което Ви позволява да управлявате съдържанието, изисквано от различни клиенти. Например за добавяне на версия за iPhone на началната страница на даден сайт можете да използвате следното:

Mime::Type.register_alias "text/html", :iphone

За да бъдете сигурни, че клиента който разглежда страницата Ви идва от iPhone можете да добавите следното в Applications Controller-a:

class ApplicationController < ActionController::Base
  before_filter :test_for_iphone_client
 
  private
    def test_for_iphone_client
      if request.env["HTTP_USER_AGENT"] && 
         request.env["HTTP_USER_AGENT"][/(iPhone|iPod)/]
        request.format = :iphone
      end
    end
end

След това в контролера можете да добавите конструкция, абсолютно идентична на тези от старите версии на Rails с която да осигурите различните view-та:

def index
  respond to do |format| 
    format.html 
    format.iphone
  end 
end

Разбира се, самите view-та трябва да седят в отделни файлове, именувани спрямо новите конвенции: index.html.erb и index.iphone.erb.

Новостите в Rails продължават да ме изненадват…


Маркери: ,

За тази статия



Категории

Подобни статии