Rails 2.0 | ActiveResource

После года разработки вышли в свет рельсы за версией 2.0. По этому поводу будет целая серия постов с описанием изменений. Этот первый, в нем приводится описание изменений в ActiveResource.

Action Pack: Resources

  • Новое соглашение: все имена контролов, основанных на ресурсах, должны быть во множественном числе
  • Пространства имен для роутов ресурсов (маршрутизация ресурсов)
  • Точка с запятой в URL ресурсов заменена на слэш

Action Pack: Multiview

  • #respond_to
  • Разделение шаблонов и движка для их обработки. Название движка вынесено в конец имени шаблона как расширение. Например: index.rhtml -> index.html.erb, feed.rxml -> feed.atom.builder
  • "Фальшивые" типы, которые используются для удобного выбора формата отображения ответа. Например можно создать тип :iphone, для генерации контента в виде, заточенном для iPhone'а

Action Pack: Record identification

Добавлено много соглашений, для удобного преобразование объектов класса ActiveRecord в URL.

# person - это объект класса Person, который по соглашению
# преобразуется в person_url для отображения его в браузере.
redirect_to(person)
link_to(person.name, person)
form_for(person)

Action Pack: HTTP Loving

Добавлена поддержка авторризации по протоколу HTTP Basic, которая позволяет легко делать авторизацию для людей, использующих REST API, для получения информации с вашего сайта.

class PostsController < ApplicationController
    USER_NAME, PASSWORD = "dhh", "secret" 

    before_filter :authenticate, :except => [ :index ]

    def index
      render :text => "Everyone can see me!" 
    end

    def edit
      render :text => "I'm only accessible if you know the password" 
    end

    private
      def authenticate
        authenticate_or_request_with_http_basic do |user_name, password| 
          user_name == USER_NAME && password == PASSWORD
        end
      end
  end

Подробнее смотрите модуль ActionController::HttpAuthentication

Добавлен хэлпер javascriptincludetag(:all, :cache => true), который при использовании в режиме production превращает все файлы public/javascripts/*.js в один файл public/javascripts/all.js и подключает на страницу его. В режиме development вы все так же можете наслаждать своими 1001 и файлом, в которых код разбит на маленькие кусочки.

Для оптимизации отдачи статических файлов в браузер добавлена опция ActionController::Base.asset_host = "assets%d.example.com" которая позволяет распределить запросы на получение статических файлов на хосты assets1, assets2, assets3, assets4, что увеличивает скорость работы сайта, потому что браузеры не скачивают более 4 файлов одновременно с одно хоста.

Action Pack: Security

  • В рельсы встроена защита от CSRF(CRSF) атак. За подробностями обращайтескь к документации по ActionController::RequestForgeryProtection.
  • Изменен принцип работы метода TextHelper#sanitize. Он стал работать про принципу white list, когда мы делаем список разрешенных тегов, вместо списка запрещенных, как это было раньше (black list).
  • Поддержка HTTP only cookies(в тех браузерах, которые их поддерживают)

Action Pack: Exception handling

Добавлен способ декларативного указания того, какой метод контроллера будет вызван при возникновении необработанного исключения в контроллере.

class PostsController < ApplicationController
  rescue_from User::NotAuthorized, :with => :deny_access

  protected
    def deny_access
      ...
    end
end

Action Pack: Cookie store sessions

По умолчанию в Rails 2.0 сессии хранятся в cookie'ах. Т.е. сессии хранятся не в файловой системе сервера или в БД, а на компьютере пользователя в захешированном виде. Такой способ хранения позволяет избавится от необходимости в периодическом удалении истекших сессиий с сервера.

Такой подход хорошо работает, если вы храните минимум информации в сессиях, например только user_id залогиненого пользователя и flash. Но еслы планируете хранить в сессии код для запуска межконтинентальных баллистических ракет, то вам лучше переключить назад на традиционный способ храниния сессий в БД или на сервере, так как куки легко могут быть прочитаны и подделаны. Но если вам пришлось это сделать, значит с вашим кодом что-то не так, подумайте о том, чтобы хранить в сессии минимум информации.

Action Pack: New request profiler

Для поиска узких мест в вашем коде добавлен профайлер, который используется следующим образом:

$ cat login_session.rb
get_with_redirect '/'
say "GET / => #{path}" 
post_with_redirect '/sessions', :username => 'john', :password => 'doe'
say "POST /sessions => #{path}" 
$ ./script/performance/request -n 10 login_session.rb

На выходе вы получаете информацию о том, где сколько времени было затрачено. А дальше уж думайте сами, инструменты не всемогущи.

Action Pack: Miscellaneous

Стоит отметить новый AtomFeedHelper для удобного создания фидов. Пример все хорошо иллюстрирует:

# index.atom.builder:
atom_feed do |feed|
  feed.title("My great blog!")
  feed.updated((@posts.first.created_at))

  for post in @posts
    feed.entry(post) do |entry|
      entry.title(post.title)
      entry.content(post.body, :type => 'html')

      entry.author do |author|
        author.name("DHH")
      end
    end
  end
end

Так же авторы поработали над улучшением производительности: вызовы asset_tag стали дешевле, именованые роуты кэшируются. Выделены в плагины хелперы inplaceeditor и autocomplete_for, вы можете найти их в оффициальном репозитории рельс.


About this entry