なるようになるブログ

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

rails commit log流し読み(2017/08/05)

2017/08/05分のコミットです。

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

activestorage/CHANGELOG.md


Merge pull request #30058 from y-yagi/use_assert_nil_if_value_is_nil_in_assert_field_default_value_

railties/lib/rails/generators/testing/assertions.rbの修正です。

assert_field_default_valueメソッドで引数valuenilの場合、assertionにassert_nilメソッドを使用するよう修正しています。

元々は引数の値に関わらずassert_equalを使用していたのですが、assert_equalのexpect引数にnilを指定するのはMinitest 5.10からdepreateになっている為。


Merge pull request #29520 from kirs/serialize-vs-postgres-native-column

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

DB nativeのJSON / array型のカラムをserializeしようとした場合に、エラー(ColumnNotSerializableError)をraiseするよう修正しています。

元々サポートしてない挙動だったのですが、使おうとして上手く動かない、というissueがあった為、明示的にエラーにするようにしたようです。


Merge pull request #30020 from rails/active-storage-import

ファイルアップロード処理用ライブラリのActive Storageがrails本体にマージされました。

Active Storageは、carrierwaveshrine らと同じ類のファイルアップロード処理用ライブラリです。クラウドサービスに簡単にファイルをアップロード、及び、Active Recordから参照ができるようになっています。 現時点で対応しているクラウドサービスは、Amazon S3, Google Cloud Storage, Microsoft Azure Storageです。

使い方を簡単に。

まず、Active Storageに必要なファイルを生成する為のtask(rails activestorage:install)が提供されいるのでそれを実行します。実行するとActive Storageで使用するようのテーブルを生成する為のmigrationファイルが生成されます。中身は下記の通り。

class ActiveStorageCreateTables < ActiveRecord::Migration[5.1]
  def change
    create_table :active_storage_blobs do |t|
      t.string   :key
      t.string   :filename
      t.string   :content_type
      t.text     :metadata
      t.integer  :byte_size
      t.string   :checksum
      t.datetime :created_at

      t.index [ :key ], unique: true
    end

    create_table :active_storage_attachments do |t|
      t.string  :name
      t.string  :record_type
      t.integer :record_id
      t.integer :blob_id

      t.datetime :created_at

      t.index :blob_id
      t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true
    end
  end
end

active_storage_blobsactive_storage_attachmentsの2テーブル作られるようになっています。

後は各種クラウドサービス用のgem(aws-sdkgoogle-cloud-storage等)をGemfileに定義すれば準備は完了です。

実際に使用するには、画像を使用する事を宣言する為のメソッド(has_one_attachedhas_many_attached)が提供されているので、それをmodelの中で使用すればアップロードが出来るようになります。

class User < ApplicationRecord
  has_one_attached :avatar
end

user.avatar.attach io: File.open("~/face.jpg"), filename: "avatar.jpg", content_type: "image/jpg"
user.avatar.attached? # => true

url_for(user.avatar) # まだこの辺りの挙動は怪しい印象

画像の情報は先に作成したテーブル(active_storage_blobsactive_storage_attachments)で管理するようになっており、model毎のテーブルにはデータを作らないようになっています。

ファイルのアップロード先(どのクラウドサービスを使うか)はconfig/storage.ymlで定義するようになっています。デフォルトでdevelopmenttest環境ではローカルにファイルを作成するようになっています。

また、JSからのファイルのダイレクトアップロード機能も提供されています。詳細はActive StorageのREADMEを参照して下さい。


Fix repository URL [ci skip]

activestorage/README.mdactivestorage/package.jsonの修正です。

GitHubへのリンクがhttps://github.com/rails/activestorageになっていたのをhttps://github.com/rails/railsに修正しています。


module ActiveStorage, not ActiveStorage::Class

Active Storageの修正です。

Active Storageの各クラスをActiveStorage module配下に移動しています。

+module ActiveStorage
 # Abstract baseclass for the concrete `ActiveStorage::Attached::One` and `ActiveStorage::Attached::Many`
 # classes that both provide proxy access to the blob association for a record.
-class ActiveStorage::Attached
-  attr_reader :name, :record
+  class Attached
+    attr_reader :name, :record

既存のコンポーネントの構成と合わせる、及び、API docに正しくクラス名が表示されるようにする為に、との事です。


Fix ruby warnings

Active Storageの修正です。

各コードでRubyのwarningが出ていたのをまとめて修正しています。


Add missing blank line between config.active_storage and config.action_cable

railties/lib/rails/generators/rails/app/templates/config/environments/production.rb.ttの修正です。

config.active_storageconfig.action_cableの間にスペースをいれるよう修正しています。


Change gem version of Active Storage to 5.2.0.alpha

activestorage/lib/active_storage/gem_version.rbの修正です。

Active Storageのバージョンを5.2.0.alphaに修正しています。


Revert “Merge pull request #15446 from akshay-vishnoi/doc_changes”

大分古いコミットの、[ci skip] Correct documentation of HashWithIndifferentAccess#dupをrevertしています。

HashWithIndifferentAccess#dupのdocのexampleコードを修正したコミットだったのですが、元のdocの方が正しかった為revertしています。

     #   dup  = hash.dup
     #   dup[:a][:c] = 'c'
     #
-    #   hash[:a][:c] # => nil
+    #   hash[:a][:c] # => "c"
     #   dup[:a][:c]  # => "c"

Remove unecesarry exception variable

activestorage/lib/active_storage/service/azure_storage_service.rbの修正です。

AzureStorageService#uploadメソッドから使用していない変数を削除しています。


Check for app.secrets.secret_key_base, not app.config.secret_key_base

activestorage/lib/active_storage/engine.rbの修正です。

secret_key_baseを参照するのに誤ってapp.configを使用していたのを、app.secretsを使用するよう修正しています。


Merge pull request #30068 from kamipo/user_start_with_than_regexp

activestorage/app/models/active_storage/blob.rbの修正です。

content typeをチェックするのにRegexp#=~を使用していたのをString#start_with?を使用するよう修正しています。

-    content_type =~ /^image/
+    content_type.start_with?("image")

start_with?の方が高速な為。

rails commit log流し読み(2017/08/04)

2017/08/04分のコミットです。

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

activesupport/CHANGELOG.md


Fix changelog format

activesupport/CHANGELOG.mdの修正です。

エントリー間の改行が不足していたのを追加しています。


Merge pull request #30039 from ricardotk002/fix-string-camelize-invalid-option

activesupport/lib/active_support/core_ext/string/inflections.rbの修正です。

String#camelizeメソッドの引数に不正な値(:upper:lower以外の値)を指定した場合、ArgumentErrorをraiseするよう修正しています。


Add backticks around String#camelize

activesupport/CHANGELOG.mdの修正です。

`エントリー内のメソッド名にバッククォートを追加しています。


Merge pull request #30050 from kamipo/dont_pass_connection_to_statement_cache_execute

Active Recordの修正です。

StatementCache#initializeの引数にklassを追加しています。

元々はStatementCache#executeの引数にklassを渡すようになっていたのですが、実際は毎回同じklassを渡すようになっており、メソッド呼び出し時に毎回渡す必要は無い為初期化処理で渡すようにしています。合わせて、StatementCache#executeの引数からklassは削除しています。


Revise bundle binstub error message

railties/lib/rails/app_loader.rbの修正です。

Bundlerが生成したrailsコマンドを使用していた場合に出力エラーメッセージを改善しています。

元々はbinstubについての詳細な説明等が含まれていたのですが、不要そうな説明は削除し、更新するにはapp:update:binを実行すれば良い旨説明を修正しています。


Fix all rubocop violations

rubocopの設定に違反している箇所があったのを、まとめて修正しています。


Remove unused LoadError::REGEXPS constant

activesupport/lib/active_support/core_ext/load_error.rbの修正です。

使用していないLoadError::REGEXPS定数を削除しています。


Use Concurrent::Map than Mutex and Mutex_m for statement caches

activerecord/lib/active_record/core.rbactiverecord/lib/active_record/reflection.rbの修正です。

statement cacheの管理をmutext + Hashで行っていたのを、Concurrent::Mapを使用するよう修正しています。


Merge pull request #30022 from y-yagi/remove_extra_empty_line

railties/lib/rails/generators/rails/app/templates/Gemfileの修正です。

rails newで生成されるGemfilerubyのバージョン指定とgemの間に不要な空行があったのを削除しています。

rails commit log流し読み(2017/08/03)

2017/08/03分のコミットです。

CHANGELOGへの追加はありませんでした。


Merge pull request #29984 from colorfulfool/form-helpers-unicode-sanitization

actionview/lib/action_view/helpers/tags/base.rbの修正です。

collection_radio_buttonscollection_check_boxesのvalueに英語以外の値を指定出来るよう、サニタイズ処理を修正しています。

          def sanitized_value(value)
-            value.to_s.gsub(/\s/, "_").gsub(/[^-\w]/, "").downcase
+            value.to_s.gsub(/\s/, "_").gsub(/[^-[[:word:]]]/, "").mb_chars.downcase.to_s
           end

Handling add/remove to/from migration edge cases

activerecord/lib/rails/generators/active_record/migration/migration_generator.rbの修正です。

table名にtofromが含まれている場合に、migration generatorが正しくmigrationファイルを生成出来ない(生成されるmigrationファイルのテーブル名がおかしい)バグがあったのを修正しています。

例えば、blacklisted_from_campaignsというテーブルがあった場合に /rails g migration add_email_address_to_blacklisted_from_campaign email_address:string migrationを生成した場合:

before

class AddEmailAddressToBlacklistedFromCampaign < ActiveRecord::Migration[5.2]
 def change
   add_column :campaigns, :email_address, :string
 end
end

after

class AddEmailAddressToBlacklistedFromCampaign < ActiveRecord::Migration[5.2]
  def change
    add_column :blacklisted_from_campaigns, :email_address, :string
  end
end

rails commit log流し読み(2017/08/02)

2017/08/02分のコミットです。

CHANGELOGへの追加はありませんでした。


Path parameters should default to UTF8

Action Packの修正です。

path parametersをデフォルトUTF-8として扱うよう修正しています。parametersと挙動を合わせる為。

これにより、path parameterにUTF-8として不正な値が含まれていた場合、400 bad requestがかえるようになります


Update working_with_javascript_in_rails.md

rails guideのWorking with JavaScript in Railsの修正です。

rails-ujsへのリンクを https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts/rails-ujs.coffee から https://github.com/rails/rails-ujs/tree/master に修正しています。

しかし rails/rails-ujsはprivateリポジトリにして外から見えないようになっており、railsの中のコードを指している状態が正しい為、後ほど再度修正されています。


Merge pull request #30023 from y-yagi/remove_unnecessary_doc_directory_deletion

railties/lib/rails/generators/rails/plugin/plugin_generator.rbの修正です。

dummy applicationでdocディレクトリを削除する処理を削除しています。

doc/README_FOR_APP is no longer generateddocディレクトリはデフォルトで作成されなくなった為。


Clarify route encoding test

actionpack/test/dispatch/routing_test.rbの修正です。

route encodingのテストをparamsに不正なUTF-8 が含まれている場合のテストと、不正なUTF-8があった場合にbinaryとしてparamsを扱う場合とでテストをわけています。


Use duktape gem as default JS engine on Windows-MINGW and MS-Visual-C builds

railties/lib/rails/generators/app_base.rbの修正です。

mingw / mswinの環境では、JS engineにduktapeを使用するよう修正しています。


Update working_with_javascript_in_rails.md

rails guideのWorking with JavaScript in Railsの修正です。

rails-ujsへのリンクを https://github.com/rails/rails-ujs/tree/master から https://github.com/rails/rails/tree/master/actionview/app/assets/javascriptsに修正しています。


Merge pull request #29724 from eugeneius/sync_primary_key

Active Recordの修正です。

primary keyに対して更新・参照等を行う際に、transaction stateを同期するよう修正しています。

transactionをrollbackした際、modelの値を元の状態に戻す必要があるのですが、custome primary keyを使用している場合にその戻し処理が正しく動作していなかった、かつ、その戻し処理の中でtransaction stateの値を参照しているため、primary keyにアクセスした際に transaction stateを同期するようにしたとの事です。


Merge pull request #29777 from yui-knk/set_content_type

actionpack/lib/action_dispatch/http/response.rbの修正です。

Response#charset=リファクタリングとして、不要な変数を削除するよう修正、及び、headerを設定するのにset_headerではなく、set_headerのラッパーであるset_content_typeメソッドを使用するよう修正しています。


Merge pull request #29271 from rails/unlock-minitest

Railsのテストで使用するminitestのバージョンが5.3.4未満に固定されていたのを、バージョン固定を削除、及び各テストを修正しています。

minitest 5.3.4からテストをランダムに実行するようになったのですが、Rails自体のテストはランダムに実行するとコケる(実行順に依存しているテストが多数あった)為、minitestのバージョンを固定していました。で、このバージョン固定を削除出来るよう、各テストをランダムに実行しても問題無いよう修正しています。

修正内容は色々混ざっているので、詳細はPR(Unlock minitest for Rails' test suite)を参照してください。


Merge pull request #29842 from kamipo/fix_find_by_with_range

activerecord/lib/active_record/core.rbactiverecord/lib/active_record/statement_cache.rbの修正です。

find_byの引数にRangeを指定した場合にレコードを正しく取得出来ないバグがあったのを修正しています。


Merge pull request #29914 from kamipo/relation_merger_should_not_fill_empty_values

activerecord/lib/active_record/relation/merger.rbactiverecord/lib/active_record/relation/query_methods.rbの修正です。

Relation#mergevaluesに空の値を設定しないよう修正しています。

不要なvaluesの変更を行わないようにし、Relation#empty_scope?が正しく値を返せるようにする為、のようです。多分。


Merge pull request #29958 from znz/file-null

/dev/nullを直接参照していた箇所を、File::NULL定数を使用するよう修正しています。

rails commit log流し読み(2017/08/01)

2017/08/01分のコミットです。

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

railties/CHANGELOG.md


Set Ruby version in Gemfile and .ruby-version by default

railtiesの修正です。

rails newで新規にアプリを作成する際、.ruby-versionファイルを作成、及び、GemfileRubyバージョン(e.g. ruby '2.4.1')を指定するよう修正しています。


fix typo in assert_changes error message

activesupport/lib/active_support/testing/assertions.rbの修正です。

assert_changesのエラーメッセージにタイポがあったのを修正しています。


Add backticks around method [ci skip]

activerecord/CHANGELOG.mdの修正です。

CHANGELOGのエントリー内のメソッド名をバッククォートで囲むよう修正しています。


Talk about bytes not characters

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

ActiveModel::SecurePassword module内の各docで、パスワード最大長が72文字である旨説明がされていたのですが、実際は72バイトの為、その旨docを修正しています。


Fix rubocop style issues in yarn and spring.rb templates"

railties/lib/rails/generators/rails/app/templates/bin/yarnrailties/lib/rails/generators/rails/app/templates/config/spring.rbの修正です。

Stringを生成するのにダブルクォートを使用していたのをシングルクォートを使用するよう修正、及び、Arrayを使用するのに%w()を使用していたのを%w[]を使用するよう修正しています。デフォルトのRubocopのルールに従うようにする為、との事なのですが、rails自体に設定されているcopはまた違ったりしているので、うーん。


Merge pull request #30024 from kamipo/remove_redundant_unless_branch

activerecord/test/cases/comment_test.rbの修正です。

current_adapter?(:OracleAdapter)による分岐処理が2つ続いていたので、1つにマージしています。


[ci skip] Fix rails_command comments

railties/lib/rails/generators/actions.rbのdocの修正です。

rails_commandメソッドのdoc内のexampleコードで、使用するメソッド名に誤りがあったのを修正しています。

rails commit log流し読み(2017/07/31)

2017/07/31分のコミットです。

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

activerecord/CHANGELOG.md


Merge pull request #29950 from MaxLap/avoid_or_clause_duplicates

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

orメソッドで、OR句から共通条件を抽出して、不要なOR句を削減出来るよう修正しています。

例。

class Project < ApplicationRecord
  scope :big, -> { where(big1: true).or(where(big2: true)) }
  scope :important, -> { where(important1: true).or(where(important2: true)) }
end

上記のようなscopeがあった場合、結果が下記のように変わります。

# before
Project.big.important
# => Project Load (0.2ms)  SELECT  "projects".* FROM "projects" WHERE (("projects"."big1" = ? OR "projects"."big2" = ?) AND "projects"."important1" = ? OR ("projects"."big1" = ? OR "projects"."big2" = ?) AND "projects"."important2" = ?) LIMIT ?  [["big1", 1], ["big2", 1], ["important1", 1], ["big1", 1], ["big2", 1], ["important2", 1], ["LIMIT", 11]]


# after
Project.big.important
# => Project Load (0.5ms)  SELECT  "projects".* FROM "projects" WHERE ("projects"."big1" = ? OR "projects"."big2" = ?) AND ("projects"."important1" = ? OR "projects"."important2" = ?) LIMIT ?  [["big1", 1], ["big2", 1], ["important1", 1], ["important2", 1], ["LIMIT", 11]]

rails commit log流し読み(2017/07/30)

2017/07/30分のコミットです。

CHANGELOGへの追加はありませんでした。


Fix test directory to correct path

actionview/package.jsonactionview/test/ujs/public/test/data-confirm.jsactionview/test/ujs/public/test/data-remote.jsの修正です。

eslintに指定するrails-ujsのテストディレクトリのパスに誤りがあったのを修正、及び、一部テストのコードにlint違反があったのを修正しています。


Change http postgresql.org links to https [ci skip]

www.postgresql.orgへのリンクをhttpからhttpsに修正しています。

今はhttpsが正しいURL(httpでアクセスするとhttpsにリダイレクトされる)な為。

参考:Change documentation references to PG website to use https: not http


Merge pull request #29963 from y-yagi/fix_ruby_warnings

ailties/test/application/routing_test.rbの修正です。

routingのテストでRubyのwarning(warning: method redefined; discarding old model_name)が出ていたので、model_nameをクラスメソッドとして定義し対応しています。


Fix github user output.

tasks/release_announcement_draft.erbの修正です。

release announcement用のスクリプトで、announcement内の問題があった場合にメンションするGitHubのユーザ名が正しく表示されなかったのを修正しています。


Merge pull request #29951 from georgeclaghorn/action-view-test-flow

actionview/lib/action_view/test_case.rbの修正です。

ActionView::TestCaseクラスで@view_flow変数を保持するよう修正しています。

content_forのようなcaptureメソッドでは上記変数がメソッドを使用するコンテキストに存在する必要がある為。