4
0

More than 3 years have passed since last update.

Rails6 のちょい足しな新機能を試す101(ActionController::Paramters#transform_keys編)

Posted at

はじめに

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 メソッドを以下のように変更してみます。

app/controllers/users_controller.rb
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 になってしまいます。

今度は、以下のように修正してみます。

app/controllers/users_controller.rb
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

参考情報

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0