コントローラには、ストロングパラメータというDBに保存するparameterのキー(カラム名)を指定するものがある。ここでは、そもそもparameterのキーはどこから送られてくるのか、なぜ、キーを指定なければならないのか、について書いていきます。
parameterのキーはどこから送られてくるのか?
ユーザーのリスエストする際に送られるparamsは、viewの方(新規投稿画面など)から送られてきている。そして、viewの方では、どのような設定がなされているのかというと、ここではparamsのキーを設定するためのHTMLのname属性というのが理解の鍵となる。
※ちなみに、parameterとは、ユーザーがリクエストする際に入力される1つ1つのデータのことをいう。そして、paramsとは、parameterが複数あるもので、データのまとまりのことをいう。
name属性とは何か?
name属性は、parameterに対してデータとしての名前をつけることができるHTML属性である。これによって、ユーザーがリクエストをする際に、viewの方で入力されたparameterにnameのキーをつけることができる。name属性をつけるときは、保存したいデータベースのカラム名にすること。
以下の例では、ユーザが入力した文章はtextで、画像のURLはimageというキーをつけている。(今回はわかりやすく説明するため、form_tagを使いました。)
新規投稿画面の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>
そして、コントローラの方でストロングパラメータのキーにname属性ので指定したキーを設定すれば、入力されたparameterのキーとストロングパラメータのキーが一致して、紐づけができるようになる。
以下では、新規登録画面のviewのname属性のキーとストロングパラメーターのキーが一致
しているため、ユーザが新規登録した内容のparamsがDBに保存されるようになる。
params.permit(:image, :text)
コントローラのストロングパラメーター
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