なるようになるブログ

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

rails commit log流し読み(2015/06/12)

2015/06/12分のコミットです。

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

actionpack/CHANGELOG.md

activerecord/CHANGELOG.md

長いこと議論が行われていたRails apiがようやくマージされています。


Merge pull request #20516 from kares/patch-2

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

ActionDisplatch::Reloaderのフック処理で、キャッシュのクリアーより前にコネクションのクリアーを行っていたのを、順番を逆にしています。

-            ActiveRecord::Base.clear_reloadable_connections!
             ActiveRecord::Base.clear_cache!
+            ActiveRecord::Base.clear_reloadable_connections!

clear_reloadable_connections!メソッドclear_cache!メソッドで使用するコネクションもクリアーしてしまう為、順番を入替えたようです。


Merge pull request #19832 from spastorino/rails-api

ActionPackの修正です。APIだけのアプリ用サポート(Rails api)を追加しています。

Rails apiは、ざっくりというとAPIに必要と思われる機能だけをロードするようにしたRailsアプリで、通常のRailsアプリよりロードするミドルウェアが少なくなっています。

新規にRails apiを使用するには、rails new--apiオプションを指定してあげればOKです。

rails new api_sample --api

上記で生成したRailsアプリは、3つの特徴があります。

  • ロードするミドルウェアが通常のRailsアプリより制限される
  • ApplicationControllerの親クラスが、ActionController::BaseではなくActionController::APIになる
  • views、helpers 及び assetsファイルが生成されなくなる

ActionController::APIクラスがロードするミドルウェアを制限する為のAPIの為の親クラスです。

views、helpers及びassetsが生成されないので、APIには不要だからとの為です。実際Rails api上でscaffoldすると、以下のような結果になります。

$ ./bin/rails g scaffold Todo name:string
      invoke  active_record
      create    db/migrate/20150613000556_create_todos.rb
      create    app/models/todo.rb
      invoke    test_unit
      create      test/models/todo_test.rb
      create      test/fixtures/todos.yml
      invoke  resource_route
       route    resources :todos
      invoke  scaffold_controller
      create    app/controllers/todos_controller.rb
      invoke    test_unit
      create      test/controllers/todos_controller_test.rb

Rails apiJSONを返すよう設定されていますが、使用するライブラリはデフォルトではactive_model_serializersになっています。jbuilderじゃないのは、デフォルトではview層を生成しないからのようです。


fixed sring to be string in ActiveRecord::Base params documentation

actionpack/lib/action_controller/base.rbのdocの修正です。

sring -> stringにタイポを修正しています。


Correctly handle array columns with defaults in the schema dumper

activerecord/lib/active_record/connection_adapters/postgresql/oid/array.rbの修正です。

PostgreSQLで、decimal型をarrayで使用していた場合に、defaultに指定した値が正しくschema.rbに出力されないバグがあったのを修正しています。

issueより。

create_table :things do |t|
  t.string :features, array: true, default: ['base']
  t.decimal :prices, array: true, default: [9.99]
  t.decimal :default_price, default: 9.99

  t.timestamps null: false
end

上記のようなmigrationファイルがあった場合に、以下のように正しい内容で出力されるよう修正しています。

# before
create_table "things", force: :cascade do |t|
  t.string   "features",      default: ["base"],                                                   array: true
  t.decimal  "prices",        default: [#<BigDecimal:7fe6171cb560,'0.999E1',18(18)>],              array: true
  t.decimal  "default_price", default: 9.99
  t.datetime "created_at",                                                            null: false
  t.datetime "updated_at",                                                            null: false
end

# after
create_table "things", force: :cascade do |t|
  t.string   "features",      default: ["base"],              array: true
  t.decimal  "prices",        default: [9.99],                array: true
  t.decimal  "default_price", default: 9.99
  t.datetime "created_at",                       null: false
  t.datetime "updated_at",                       null: false
end

Credit the author of #20515 in the previous commit

activerecord/CHANGELOG.mdの修正です。

先のarrayカラムの対応について、issue報告者の名前をクレジットに追加しています。


Add a missing test case for the persistence behavior of serialize

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

serializedされるattributeにnilが指定された場合のテストを追加しています。


assigns was removed from Rails

railties/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rbの修正です。

Rails apiのテンプレートファイルから、assignsメソッドを使用したテストを削除しています。assignsメソッドが既にrails本体から削除済みの為。


Add an invert method for remove_foreign_key

ActiveRecordのmigrationの修正です。

remove_foreign_keyメソッドがreversibleになるよう対応しています。add_foreign_keyメソッドと同じオプションを指定してあげれば、reversibleになります。


Fix failing tests for Rails-API

railties/test/application/rake_test.rbの修正です。

Rails apiのテンプレートファイルからassignsメソッドを使用してテストを削除した影響で、Rails apiを生成し、rake testした場合のテストの実行結果が変わってしまった為、実行結果を確認するテストも合わせて修正しています。


Merge pull request #20058 from farukaydin/cache-digests-dependency-rake

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

ActionView::Digestor#dependenciesメソッドActionView::Digestor#nested_dependenciesメソッドでdigest対象のファイルが存在しなかった場合に、エラー情報を握りつぶしてしまっていたのを、エラー情報をログファイルに出力するよう修正しています。


fix doc about foreign key name [ci skip]

rails guideのActive Record Migrationsの修正です。

foreign KEY の生成パターンが、元々ランダムな文字列だったのが、Generate consistent names for foreign keys · rails/rails@b8e1f20の対応から、テーブル名とカラム名をキーにしたハッシュを生成するようになっていたのですが、説明が古いままだったのを修正しています。


Update RDoc for ActionController::TestCase for kwargs.

actionpack/lib/action_controller/test_case.rbのdocの修正です。

postメソッドを使用したサンプルで、メソッドの引数にキーワード引数を使用するよう修正しています。


Add enum prefix/suffix option to enum definition

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

enumに、prefix/suffixを指定出来る、:enum_prefix/:enum_suffixオプションを追加しています。

単純に:enum_prefix/:enum_suffixオプションにtrueを追加すると、enumの値に属性名が追加されます。

class Invoice < ActiveRecord::Base
  enum verification: [:done, :fail], enum_prefix: true
end
Invoice.verification_done.all
#=> Invoice Load (0.6ms)  SELECT "invoices".* FROM "invoices" WHERE "invoices"."verification" = $1  [["verification", 0]]

また、:enum_prefix/:enum_suffixオプションには任意の文字列を指定する事も出来ます

class Invoice < ActiveRecord::Base
  enum verification: [:done, :fail], enum_prefix: :verify
end
Invoice.verify_done.all
#=> Invoice Load (0.6ms)  SELECT "invoices".* FROM "invoices" WHERE "invoices"."verification" = $1  [["verification", 0]]