Railsのsaveメソッドがうまく動作しないです。
Railsにてアプリを作っております。初心者です。
現在
- Topモデル
- Trouserモデル
- Shoeモデル
- Collectionモデル
があり、
- @top
- @trouser
@shoe
はそれぞれCarrierWaveでアップロードされた、 :top_image, :trouser_image, :shoe_image のプロパティを持っています。
CollectionコントラローラーのnewのビューページではTop, Trouser, Shoeモデルからインスタンスを取得し、画像を一覧表示しています。
.d-block
= form_with model: @collection, url: collections_path , local: true do |f|
.form-check
- @tops.each do |top|
= image_tag "#{top.top_image.url}"
= label_tag :top_image
=f.radio_button :top_image, top.top_image , checked: false
.form-check
- @trousers.each do |trouser|
= image_tag "#{trouser.trouser_image.url}"
=f.label :trouser_image
=f.radio_button :trouser_image, trouser.trouser_image, checked: false
.form-check
- @shoes.each do |shoe|
= image_tag "#{shoe.shoe_image.url}"
=f.label :shoe_image
=f.radio_button :shoe_image, shoe.shoe_image, checked: false
=f.submit '登録', class: 'btn btn-primary'
ここで、ラジオボタンでチェックされた:~~_imageをそれぞれ1枚ずつ、Collectionコントローラーで受け取り、ワンセットにしてCollectionに保存したいです。
しかし、params経由で受け取るところまでは良いのですが、受け取った後に@collectionに対してsaveメソッドを呼ぶと、@collectionがnillだとエラーが出ます。
debuggerを挟んで検証してみましたが、@collectionは値を保持しているのにも関わらず、saveメソッドを実行するとダメです(nilエラー)。
class CollectionsController < ApplicationController
...
def new
@collection = Collection.new
@tops = Top.all
@trousers = Trouser.all
@shoes = Shoe.all
end
def create
@collection = Collection.new(collection_params)
# ここの行にて p @collection や debugger でparamsの値を確認すると、しっかり値を保持しています。
# ですが、下記のように@collectionに対してsaveメソッドを呼び出すと、
# undefined method `save' for nil:NilClassが出ます。
# しかし、debuggerのコンソール内で@collection.saveを実行するとCOMMITしました。
if @colletion.save
flash.notice = 'コレクションを登録しました。'
redirect_to collections_path
else
render 'new'
end
end
private
def collection_params
{
top_id: params[:collection][:top_image],
trouser_id: params[:collection][:trouser_image],
shoe_id: params[:collection][:shoe_image]
}
# StrongParameterを使った
# params(:collection).permit(:top_image, trouser_image, shoe_image)
# でも動作しませんでした。
end
end
ここ丸2日悩まされております...。
どなたか原因が分かる方はいらっしゃいますでしょうか?