Что нового в Rails 5?

Rails 5.0 уже в вашем доме! Вышла бета версия новых рельс и вы уже можете поиграться с некоторыми нововведениями. О некоторых из них я расскажу в этом небольшом обзоре.

ActionCable

Поддержка вебсокетов в Rails — одна из наиболее популярных тем последнего времени. Теперь еще проще реализовать поддержку современных функций в вашем приложении. Для более подробного изучения есть несколько гайдов:

Attributes API

Новое API для аттрибутов позволяет определить собственные аттрибуты для модели или переопределить существующие. Например, вы можете создать тип MoneyType и определить логику для всех аттрибутов этого типа. К примеру, нам нужно поле price_in_cents в базе данных.

# app/models/product.rb
class Product < ApplicationRecord
attribute :price_in_cents, MoneyType.new
end
class MoneyType < ActiveRecord::Type::Integer
def type_cast(value)
# convert values like '$10.00' to 1000
end
end
product = Product.new(price_in_cents: '$10.00')
product.price_in_cents #=> 1000

Это также позволит переопределить типы уже существующих полей в базе. Прочитать более подробно можно тут:

ApplicationRecord

И, говоря об ActiveRecord, стоит заметить, что модель Product теперь наследуется от ApplicationRecord, а не от ActiveRecord::Base. Это потому, что рельсы теперь генерируют класс, который можно безопасно изменить под наши требования, а не манкипатчить ActiveRecord::Base. Подробнее тут:

ActiveRecord::Relation#or

Наконец появился метод #or в классе ActiveRecord. Мы может вызывать его, чтобы заменить OR в чистом SQL-е.

class Issue < ApplicationRecord
scope :reported, -> { where(status: 'reported') }
scope :open, -> { where(status: 'open') }
end
active_issues = Issue.reported.or(Issue.open)

ActiveRecord::Relation#in_batches

Новый метод #in_batches:

Person.where('age >= 18').in_batches(of: 1000) do |people|
people.update_all(can_vote: true)
end

ActiveRecord::Base#has_secure_token

Если вам нужен рандомно сгенерированный ключ для какого-то поля в базе, в Rails 5 для этого представлен метод has_secure_token. Пример:

class User < ApplicationRecord
has_secure_token :email_unsubscribe_token
end
user = User.create
user.email_unsubscribe_token #=> 'e2426a93718d1817a43abbaa'
user.regenerate_email_unsubscribe_token

Rails API

Гем rails-api теперь слит с основными рельсами. Это позволит генерировать рельсовое приложение исключительно с целью предоставления API, т.е. без множества функций, которые присутствуют в обычном приложении. API-only приложение можно сгенерировать с помощью ключа — api:

rails new my-app-api --api

ActionController::Renderer

Рендеринг вьюх был вынесен за пределы ActionController::Renderer и теперь доступен везде с помощью метода ApplicationController.render . Это позволит рендерить части вьюх внутри строк и использовать их для различных классов. Пример:

MessagesController.render(partial: 'messages/message',
locals: { message: params[:message][:body] })

Если вы удивлены фактом использования рендеринга части вьюхи вне контроллера, то вот гайд, который объяснит зачем это может понадобится Getting Started with ActionCable .

Turbolinks 3

Последняя версия турболинкса представила функцию для замены частей вьюхи, что позволяет заменять определенные div-ы на странице. Использование data-turbolinks-permanent, также позволит вам перемещать DOM элементы между страницами. Это может быть полезно для различных меню, которые всегда остаются неизменными.

На стороне сервере, вы можете запустить замену кусков страницы используюя дополнительные опции с методамиredirect_to или render . Взгляните на следующий код:

class CommentsController < ApplicationController
def create
@comment = Comment.new(comment_params)
    if @comment.save
redirect_to comments_url, change: 'comments'
else
render :new, change: :new_comment
end
end
end

Если комментарий сохранен успешно, заменяется только див с айди ‘comments’. В случае ошибки, заменяется только элемент ‘new_comment’ в самой форме.

New command router

Бывало такое, что вы случайно вводили rails db:migrate или rake generate model? Выяснение назначения комманд часто вызывает трудности у новичков. Теперь все комманды идут через rails, поэтому мы можем использовать комманды типо этой — rails db:migrate. Rake комманды все еще доступны, если вы захотите их использовать.

Snappier development mode

В девелопмент моде, Rails перезагружает константы, если видит, что какой-то файл изменился. Rails 5 представляет более современную систему, которая работает асинхронно и спрашивает рельсы о каких-либо изменениях. Как результат девелопмент мод стал намного быстрее. Подробнее тут:

Test runner

Запуск тестов для minitest также претерпел изменения, а именно: улучшенные сообщения об ошибках, цветовой вывод и возможность запускать одиночные тесты. Подробнее об улучшениях тут:

Supports only Ruby 2.2.2+

Новая версия рельс будет работать только с версией Ruby 2.2.2 и выше. Это позволит рельсам повысить производительность, используя последний изменения в сборщике мусора(GC).

Если вы все равно собирались обновить руби, возможно вам интересно взглянуть на улучшения версии 2.3, которая недавно вышла with a bunch of new features.

Upgrading

С момента релиза 5 версии, все версии от 4.1.x и ниже, более не будут поддерживаться. Если вы планируете обновить до версии 5.0, эти ресурсы могут вам помочь:

Links

Также о новых фишках можно прочитать тут:

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.