ストロングパラメータの書き方。というより外部キーもちのテーブルのformの書き方。

なんかハマったのでメモ

 

そもそもユーザーモデルがあって、user has many picturesでpicture belongs to user な関係のテーブルを作る時にうまくcarrierwaveのでアップロードした画像のパスがDBに保存できなかった時の話。

<%= form_for(@picture, url: {controller: 'pictures', action: 'create' }) do |f| %>
<%= f.hidden_field :user_id, :value => current_user.id %>
<%= f.label :image %>
<%= f.file_field :image %>
<%= f.submit %>
<% end %>

ユーザーidをhiddenでフォーム側で入れといてあげるとコントローラー側ではストロングパラメーターで許可してあげるだけでよくなるので簡単になる。

DBに入らない原因がどこのかハッキリしなかったのがハマった原因だと思う。恐らく原因は外部keyにuser_idを指定していたが、その値をコントーラー側で入れた上で許可しようとして書き方わからんくなってたんだと思う。form側で入れると楽。あとコントローラーで送られてきたparams名(hash名)に自信が無くなったらhtmlの検証でnameが何になってるか確認するとわかり易い形で書いてあるので良いと思う。

 

コントローラー側はこんな感じ


def create

 
# Picture.create(
# image: params[:picture][:image],
# user_id: current_user.id,
# )

Picture.create(picture_params)
 
end

private
def picture_params
params.require(:picture).permit(:image, :user_id)
end
 

 

コメントアウトは一旦ストロングパラメーター使わずにimage:とuser_id:に値入れて保存されるか試した時のもの。これでも保存はされるけどストロングパラメーター使って書くとこんな感じ。こうやって書くとシンプルだけど、許可だけでなくて値の取得までストロングパラメーターでやろうとして変にハマった。