複数のハッシュからのストロングパラメーターの設定に関して
色々参考にさせていただきながらネストしたパラメーターの取り出し方などは確認させてもらいましたが、なぜかうまく取り出すことができず、試行錯誤した結果を備忘録として残します。きっともっと簡単(正式)なやり方があるかと思うのですが、ご容赦ください。
今回は下記のパラメーターから「item」でハッシュされたものと「image」でハッシュされたものをmergeしてコントローラーへ渡し保存します。
このパラメーター(中身は微修正しています)を
pry(#<ItemsController>)> params
=> <ActionController::Parameters {"authenticity_token"=>”hoge==", "image"=><ActionController::Parameters {"images"=>(中略)Type: image/jpeg\r\n">]} permitted: false>, "item"=><ActionController::Parameters {"name"=>”hoge”, "info"=>”hoge”, "category_id"=>”1”, "sales_status_id"=>"2", "shipping_fee_status_id"=>"3", "prefecture_id"=>"3", "scheduled_delivery_id"=>"2", "price"=>"4000"} permitted: false>, "commit"=>"出品する", "controller"=>"items", "action"=>"create"} permitted: false>
下記コントローラーへ送って保存したい。
def create
@item = Item.new(item_params)
end
結果
def create
@item = Item.new(item_params)
end
private
def item_params
image_params = params.require(:image).permit(images: [])
params.require(:item).permit(:name, :info, :category_id, :sales_status_id, :shipping_fee_status_id, :prefecture_id,
:scheduled_delivery_id, :price).merge(user_id: current_user.id, images: image_params[:images])
end
試行錯誤の内容
まず、今までの知識で考えて、上記はベースとしつつもmargeの中でimagesを取り出しスマートに送るはずが、、うまくいかず。。
一度、reqireを外してpermit で全てを指定いくため、ネストなどの関係も記述するもうまくいかず。
慣れないことをするよりも今の知識でできる方法がないかと模索し、一度imagesだけを取り出して、それをmergeする方法にたどり着き、
def item_params
image_params = params.require(:image).permit(images: [])
params.require(:item).permit(:name, :info, :category_id, :sales_status_id, :shipping_fee_status_id, :prefecture_id,
:scheduled_delivery_id, :price).merge(user_id: current_user.id, images: image_params)
end
とするも、Could not find or build blob: expected attachableというエラーで、何やら見つからなかったとのこと。
再度パラメーターを確認すると、ハッシュに組み込まれているものの、image_paramsに"images"=><ActionController::Parametersが代入したimage_params余計に含まれている模様。
上記をそのままmergeしたのでエラーとなったようですね。ここから先ほど少し学習したネストを思い出し、この中からimeges以降を取り出せないかとやった結果が上記となります。
絶対にもっとスマートなやり方がある!とささやくもう一人の自分を押し殺し数時間に及ぶ戦いに終止符が打たれました。