Статьи

Возможности Rails 2.0: несколько просмотров

Семя было сшито для следующего основного выпуска платформы 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. Это делает обслуживание различных версий вашего сайта еще проще.