Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Вышел релиз Rails 4.1. Некоторые тонкости переезда

Anna | 20.06.2014 | нет комментариев
8 апреля в официальном блоге Ruby on Rails возникло сообщение об официальном выходе Rails 4.1. Каждый функционал уместился в 5200 коммитов.

На прогре теснее был обзор бета версии. Также дозволено почитать Release notes и A Guide for Upgrading Ruby on Rails.В статье я бы хотел остановиться на некоторых тонкостях и деталях того, что под капотом.

Active Record Enums

class Conversation < ActiveRecord::Base
  enum status: [ :active, :archived ]
end

# conversation.update! status: 0
conversation.active!
conversation.active? # => true
conversation.status  # => "active"

# conversation.update! status: 1
conversation.archived!
conversation.archived? # => true
conversation.status    # => "archived"

# conversation.update! status: 1
conversation.status = "archived"

# conversation.update! status: nil
conversation.status = nil
conversation.status.nil? # => true
conversation.status      # => nil

Сейчас мы имеем вот такой синтаксис для перечислений. Дюже аппетитно, дюже комфортно, но значимо понимать несколько моментов.

1. Перечисление сохраняется как целое число в базе, но может быть получено по имени. (Enum values map to integers in the database, but can be queried by name).
Вот так будет выглядеть миграция примера выше:

create_table :conversations do |t|
  t.column :status, :integer
end

При этом в SQL-запросах тоже придется применять целые числа:
where('status <> ? OR status <> ?', 0, 1)
where('status <> ? OR status <> ?', STATUS[:resolved], STATUS[:rejected])
Обратите внимание, что в даном случае STATUS — это константа класса, добавляемая макросом механически при создании перечисления.

2. Перечисление не использует ENUM тип, реализованный в некоторых в базах данных. Как следствие — невозможно изменять порядок значений в перечислении позже создания записей в базе. Это приведет к путанице и раздорам. Невозможно также легко удалить непотребное значение. Для этого соответствие между строковыми и численными значением должно быть задано очевидно.

class Bug < ActiveRecord::Base
  enum status: {
    new: 0,
    #removed status with id=1
    in_progress: 2,
    resolved: 3,
    rejected: 4,
    reopened: 5
  }
end

Получить данный хэш дозволено через Bug.statuses

3. Есть ограничения по именам значений перечисления.
Невозможно называть значения enum’ов именами существующих scopes, ассоциаций (что ясно) и теснее существующих перечислений в рамках одной модели (что неочевидно). Скажем:

class Bug < ActiveRecord::Base
  enum status: [ :new, :closed ]
  enum code_review_status: [ :new, :finished ] # Так делать невозможно
end

Новое поведение Default scopes

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

class User < ActiveRecord::Base
  default_scope { where state: 'pending' }
  scope :active, -> { where state: 'active' }
  scope :inactive, -> { where state: 'inactive' }
end

Сейчас User.active будет равнозначно User.where(state: 'pending').where(state: 'active'). Т.е. по умолчанию все scopes цепляются(chains) к default_scope.
Дабы избежать этого необходимо очевидно «отцепить» scope от default_scope с поддержкой unscope, except, rewhere:

class User < ActiveRecord::Base
  default_scope { where state: 'pending' }
  scope :active, -> { unscope(where: :state).where(state: 'active') }
  scope :inactive, -> { rewhere state: 'inactive' }
end

Расширенная CSRF охрана.

Сейчас по умолчанию CSRF охрана включена и на get запросах с форматом .js.
Для Добросовестного разработчика есть два прикладных следствия из этого.
Во-первых, валятся все тесты, которые проверяли образования положительного JS кода. Бороться с этим нетрудно.
Взамен
post :create, format: :js
Пишем
xhr :post, :create, format: :js
А во-вторых, если все-таки нужно позволить сторонним сайтам запрашивать js код, то нужно очевидно указать это, добавив фильтр в контроллер:

skip_before_filter :verify_authenticity_token, only: [:stats, :visitor]

Ну и в всяком action нужно добавить в заголовок результата:

response.headers['Access-Control-Allow-Origin'] = '*'

Либо взамен звездочки указать имя сайта, которому разрешен доступ.

Пока это всё, с чем пришлось повозиться самому. Кончено же, функционал нового релиза Rails 4.1 значительно шире. Но там как раз все как бы ясно, про это теснее писали, к тому же, изложение новой функциональности как неизменно на высоте.
Но на каждый случай приведу список остальных Major Features:

  • Добавлен прелоадер Spring по умолчанию в новые планы
  • Добавлен файл config/secrets.yml совместно с функционалом для хранения секретов приложений.
  • Action Pack Variants — вероятность применения различных результатов для разных типов устройств (tablet, desktop, phone, etc.)
  • Action Mailer Previews — интеграция gem’а MailView в Rails — комфортная работа с образцами писем.
  • Message Verifiers — обмен и проверка подлинности значимых сообщений.
  • Module#concerning — комфортное распределение ответственности между классами (Добросовестно говоря, я пока не нахожу обстановки, когда бы мне потребовалась эта функциональность)

Официально прервана помощь MySQL 4.1 (это если еще кто-то, помимо меня вынужден трудиться с этим раритетом). В действительности пока еще работает.

Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB