はじめに
Rails 6 に追加された新機能を試す第101段。 今回は、 ActionController::Paramters#transform_keys
編です。
Rails 6 では、 transform_keys
がブロックなしで呼ばれた場合、 Enumerater オブジェクトを返すようになりました。
Ruby 2.6.5, Rails 6.0.0, Rails 5.2.3 で確認しました。
$ rails --version
Rails 6.0.0
今回は、実用的な例を思いつきませんでした。
Userの CRUD を作って確認します。 今回は、Rails 5.2.3 の動作から確認していきます。
Rails プロジェクトを作る
$ rails new rails_sandbox
cd rails_sandbox
User の CRUD を作る
$ bin/rails g scaffold User name
データベースのマイグレーションを実行する
$ bin/rails db:create db:migrate
UsersController を変更する
create
メソッドを以下のように変更してみます。
class UsersController < ApplicationController
...
def create
user_params_by_transform_keys = params[:user].transform_keys(&:to_s)
@user = User.new(user_params_by_transform_keys)
respond_to do |format|
...
end
...
end
rails server を実行して、 http://localhost:3000/users/new にアクセスしてユーザー登録してみます。
すると、 ActiveModel::ForbiddenAttributesError
になってしまいます。
今度は、以下のように修正してみます。
class UsersController < ApplicationController
...
def create
user_params_by_transform_keys = params[:user].transform_keys.each(&:to_s)
@user = User.new(user_params_by_transform_keys)
respond_to do |format|
...
end
...
end
ユーザー登録できました。
Rails 6 では
Rails 6 では、 transform_keys
でブロックを指定しなかった場合、 Enumerater オブジェクトを返すようになっており
user_params_by_transform_keys = params[:user].transform_keys(&:to_s)
としても
user_params_by_transform_keys = params[:user].transform_keys.each(&:to_s)
としても、ActiveModel::ForbiddenAttributesError
エラーになります。
エラーにならないようにするためには、一例として、 permit
を使って
user_params_by_transform_keys = params[:user].transform_keys(&:to_s).permit(:name)
のようにする必要があります。
Rails 6 の方が一貫性のある動作になっているように思います。
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try101_parameters_transform_keys