課題
フォームからの入力に対してデフォルト値を利用したいとき、 Hash#mergeを利用することで簡単にデフォルト値をベースに、入力を上書きすることが出来ます。
1def default_hash2 { 'name' => '太郎' }3end4user = User.new default_hash.merge(user_params)5
ただし注意点。 railsのparamsメソッド等で返るHashは、keyがStringであってもSymbolであっても区別しませんが rubyのHashはkeyがStringである場合とSymbolであることを区別します。 http://apidock.com/rails/ActiveSupport/HashWithIndifferentAccess
なので、もしdefault_hashのkeyがStringである場合には、上書きされない、なんてことが起きます。 基本的にHashのkeyはSymbolにしたほうがいいのですが、やむを得ずロケット記法でStringをkeyにするとこんなかんじに。
1user_params2=> { name: '花子' }3default_hash.merge(user_params)4=>5{ 'name' => '太郎', :name => '花子' }6
解決策
mergeする用のデフォルト値を格納しているhashは
1def default_hash2 { 'name' => '太郎' }.with_indifferent_access3end4
として、with_indifferent_accessしましょう。