

Railsにてアプリを作っております。初心者です。

現在

  * Topモデル
  * Trouserモデル 
  * Shoeモデル 
  * Collectionモデル

があり、

  * @top
  * @trouser
  * @shoe

はそれぞれCarrierWaveでアップロードされた、 :top_image, :trouser_image, :shoe_image
のプロパティを持っています。

CollectionコントラローラーのnewのビューページではTop, Trouser, Shoeモデルからインスタンスを取得し、画像を一覧表示しています。

[code]

    .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'
    
[/code]

ここで、ラジオボタンでチェックされた:~~_imageをそれぞれ１枚ずつ、Collectionコントローラーで受け取り、ワンセットにしてCollectionに保存したいです。  
しかし、params経由で受け取るところまでは良いのですが、受け取った後に@collectionに対してsaveメソッドを呼ぶと、@collectionがnillだとエラーが出ます。

debuggerを挟んで検証してみましたが、@collectionは値を保持しているのにも関わらず、saveメソッドを実行するとダメです(nilエラー）。

[code]

    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
    
    
[/code]

ここ丸２日悩まされております...。  
どなたか原因が分かる方はいらっしゃいますでしょうか？


CC BY-SA 4.0
2019-07-13T10:50:52.500
56622
2019-07-13T10:50:52.500
35097
question
ruby-on-rails ruby html
Railsのsaveメソッドがうまく動作しないです。