なるようになるブログ

読書感想文かrailsについてかrubyについてか

rails commit log流し読み(2021/02/19)

2021/02/19分のコミットです。

CHANGELOGにのったコミットは以下の通りです。

actionpack/CHANGELOG.md

activestorage/CHANGELOG.md


Merge pull request #41475 from Yegorov/add-uncountable

activemodel/lib/active_model/naming.rbの修正です。

ActiveModel::Nameに、uncountableかどうかをチェックする為のuncountable?メソッドを追加しています。


Add send_stream to do for dynamic streams what send_data does for static files (#41488)

actionpack/lib/action_controller/metal/live.rbの修正です。

静的ファイルをstreamで送信する為のsend_streamメソッドを追加しています。

send_stream(filename: "subscribers.csv") do |stream|
  stream.write "email_address,updated_at\n"

  @subscribers.find_each do |subscriber|
    stream.write "#{subscriber.email_address},#{subscriber.updated_at}\n"
  end
end

Add redirect_back directive to Rails 5.0 -> 5.1 upgrade guide

rails guideのUpgrading Ruby on Railsの修正です。

Upgrading from Rails 5.0 to Rails 5.1の項に、削除されたredirect_to :backについての説明を追加しています。


Allow new syntax for enum to avoid leading _ from reserved options

activerecord/lib/active_record/enum.rbの修正です。

enumで複数の引数を指定出来るよう修正しています。

enumは引数を1つしか指定出来ない都合上、reserved optionsに_を指定するようになっていました(e.g. _prefix_scopes)。

この対応により上記問題が解決される為、新しいフォーマットのを使用した場合、reserved optionsに_を指定しないで良いようになっています。

# Before

class Book < ActiveRecord::Base
  enum status: [ :proposed, :written ], _prefix: true, _scopes: false
  enum cover: [ :hard, :soft ], _suffix: true, _default: :hard
end
# After
class Book < ActiveRecord::Base
  enum :status, [ :proposed, :written ], prefix: true, scopes: false
  enum :cover, [ :hard, :soft ], suffix: true, default: :hard
end

Call run after preloading records

activerecord/lib/active_record/associations/preloader.rbactiverecord/lib/active_record/associations/preloader/association.rbの修正です。

already_loaded?のチェックが正しく動作してなかったのと、load_records_in_batchでrecordのpreloadが行われないバグがあったのを修正しています。


Extract ActiveStorage::Streaming so your own controllers can use it (#41440)

Active Storageの修正です。

blobをstorageからstreamする為のsend_blob_streamメソッドを追加しています。使用する場合、controllerでActiveStorage::Streaming moduleをincludeする必要があります。

class MyPublicBlobsController < ApplicationController
  include ActiveStorage::SetBlob, ActiveStorage::Streaming

  def show
    http_cache_forever(public: true) do
      send_blob_stream @blob, disposition: params[:disposition]
    end
  end
end