Семя было сшито для следующего основного выпуска платформы Ruby on Rails. В конце прошлого месяца был объявлен предварительный выпуск, и теперь, когда у меня появилась возможность поиграть с ним, я подумал, что пришло время рассказать о некоторых новых функциях.
Несколько просмотров
В версии 1.2 Rails был введен блок response_to, который сделал обслуживание различных типов данных, таких как XML или JSON, действительно простым. Все, что вам нужно было сделать, это примерно так:
def index
@stories = Story.find :all
respond to { |format|
format.html {}
format.xml {
render :xml => @stories.to_xml
}
format.json {
render :json => @stories.to_json
}
}
end
Затем в веб-браузере, если вы добавили расширение файла (например, /stories/index.xml), и вы получите содержимое, доставленное в требуемом формате. Вы даже можете создать свои собственные типы, добавив MIME :: Type.register в конец вашего файла environment.rb.
Одна из проблем этого подхода заключалась в том, что не было способа обслуживать разные HTML-страницы в зависимости от расширения файла. Из-за способа работы парсера MIME :: Type добавление другого обработчика содержимого с типом mime text / html привело к засорению обработчика по умолчанию, что означало, что приведенный выше код будет отображать неверное представление.
Введите Mime :: Type.register_alias
Теперь вы можете сказать Rails, чтобы он отвечал HTML на любое количество типов файлов! Допустим, вы разрабатываете мобильную версию и версию своего сайта для iPhone, вы можете создать два новых формата, добавив следующий код в новый файл /config/initializers/mime_types.rb:
Mime::Type.register_alias "text/html", :iphone
Mime::Type.register_alias "text/html", :mobile
Это делает возможным следующее:
def index
@stories = Story.find :all
respond to { |format|
format.html {}
format.xml {
render :xml => @stories.to_xml
}
format.json {
render :json => @stories.to_json
}
format.iphone {
// Serve up the iPhone version
}
format.mobile {
// Serve up the mobile version
}
}
end
Конечно, необходимость вручную отображать разные версии в каждом блоке response_to не очень СУХО, поэтому для всех файлов представления было создано новое соглашение об именах. Вместо вызова файла представления в приведенном выше примере index.rhtml вы можете создать три разные версии в зависимости от формата, который вы обслуживаете, например: index.html.erb, index.iphone.erb и index.mobile.erb.
Если rails находит подходящее представление, оно будет обрабатывать это, в противном случае оно будет обслуживать файл по умолчанию .html.erb или .rhtml. Это делает обслуживание различных версий вашего сайта еще проще.