mergeメソッドとは、2つのハッシュを結合する時に使うメソッドである。今回は、このメソッドはどうして使われているのか、というmergeメソッドの意義について書いていきます。
mergeメソッドが使われる場面
mergeメソッドが使われる場面としては、ユーザーが入力したparamsをDBに保存する時に使うことが多いです(個人的な感想)。
では、mergeメソッドを使わなかった時と使った時とで、どのような違いがあるのかを説明していきたいと思います。
mergeメソッドを使わなかった時
例えば、以下のような新規等投稿画面があった時、ストロングパラメーターに保存されるデータは、新規等投稿画面のviewの方で、name属性で指定したtext(ユーザーが入力した文章)とimage(ユーザーが入力した画像のURL)しかDBに保存されない(ただし、paramsとしてコントローラには送られてくる。)。そのため、データを入力したuserのidをDBに保存することがデッキ無くなってしまうため、コントローラのcreateアクションの引数にuser_idを指定しなければならなくなる。そうすると、createアクションの引数のコードが長くなり、可読性は失われてしまう。
新規投稿画面のview
<div class="contents row">
<div class="container">
<%= form_tag('/tweets', method: :post) do %>
<h3>
投稿する
</h3>
<input placeholder="Image Url" type="text" name="image">
<textarea cols="30" name="text" placeholder="text" rows="10"></textarea>
<input type="submit" value="SENT">
<% end %>
</div>
</div>
コントローラのストロングパラメーター
def create
Tweet.create(image: tweet_params[:image], text: tweet_params[:text], user_id: current_user.id)
end
private
def tweet_params
params.permit(:image, :text)
end
mergeメソッドを使った時
mergeメソッド使えば、paramsとして送られてきたcurrent_user.idのデータをストロングパラメーターのキーと結合させることができるようになり、createアクションの引数のコードを短くすることができ、可読性を保つことができるようになる。
mergeメソッド使った時のcreateアクションの引数とストロングパラメーター
def create
Tweet.create(tweet_params)
end
private
def tweet_params
params.permit(:image, :text).merge(user_id: current_user.id)
end