69741


初めて投稿させて頂きます。初学者ですが何卒宜しくお願い致します。

現在写真投稿機能を追加しており、その詳細画面（showアクション）からコメントを投稿できるように機能実装を行っています。  
そこで、コメントを記述し「投稿する」ボタンを押すと、何も変化がなくカラムにも投稿をしようとした文字は保存されていない状態となってしまっています。

コメント用コントローラー

[code]

    class CatPostCommentsController < ApplicationController
    
      def create
        @cat_post_comment = CatPostComment.create(cat_comment_params)
        if @cat_post_comment.save
          render "/cat_main/#{cat_post_comment.cat_post.id}"
        end
      end
    
      private
      def cat_comment_params
        params.require(:cat_post).permit(:cat_post_comment).merge(user_id: current_user.id, cat_post_id: params[:cat_post_id])
      end
    end
    
[/code]

コメントモデル

[code]

    class CatPostComment < ApplicationRecord
      belongs_to :user
      belongs_to :cat_post
    
      validates :cat_post_comment, presence: true
    end
    
    
[/code]

showのビューファイル（コメント投稿用）

[code]

      <div class="container">
          <%= form_with(model: [@cat_post_comment,@cat_post], url:cat_main_cat_post_comments_path(@cat_post), method: :post, local: true) do |form| %>
            <%= form.text_area :cat_post_comment, placeholder: "コメントする" %>
           <div class="comment_btn"><%= form.submit "コメントする" %></div>
          <% end %>
      </div>
    
    
[/code]

エラーが出てこないので、ターミナルを確認すると以下のようになっておりました。

[code]

    Started POST "/cat_main/5/cat_post_comments" for ::1 at 2020-08-20 22:35:20 +0900
    Processing by CatPostCommentsController#create as HTML
      Parameters: {"authenticity_token"=>"DgF8MsAPQAqJQzw9GtUoRg5EL+3xWnd9+QZbmGDpo44v4UyauD16C/mKdXhdwP/bSAMmt30ncBV7+/GlDbxlPg==", "cat_post"=>{"cat_post_comment"=>"test\r\n"}, "commit"=>"コメントする", "cat_main_id"=>"5"}
      User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1
       (0.2ms)  BEGIN
      ↳ app/controllers/cat_post_comments_controller.rb:4:in `create'
      User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
      ↳ app/controllers/cat_post_comments_controller.rb:4:in `create'
       (0.2ms)  ROLLBACK
      ↳ app/controllers/cat_post_comments_controller.rb:4:in `create'
    No template found for CatPostCommentsController#create, rendering head :no_content
    Completed 204 No Content in 10ms (ActiveRecord: 0.9ms | Allocations: 7721)
    
    
[/code]

これだけでは何が原因なのかわからなかったので、render部分の記述のミスを疑い、rootパスや別のバスを入力してみましたが、そもそもそこでエラーが起きていなかったようで、改善はありませんでした。  
NO FILEとなっていたマイグレーションファイルもあったので、それはコマンドを使用し削除しましたが同様のエラーで改善はありませんでした。  
そこで、binding.pryを使用し、以下のような表示となりました

[code]

        3: def create
        4:   @cat_post_comment = CatPostComment.create(cat_comment_params)
     => 5:   binding.pry
        6:   if @cat_post_comment.save
        7:     render "/cat_main/#{cat_post_comment.cat_post.id}"
        8:   end
        9: end
    
    [1] pry(#<CatPostCommentsController>)> @cat_post_comment
    => #<CatPostComment:0x00007fc6ba1fe540 id: nil, user_id: 1, cat_post_id: nil, cat_post_comment: "テスト", created_at: nil, updated_at: nil>
    [2] pry(#<CatPostCommentsController>)> @cat_post_comment.save!
    ActiveRecord::RecordInvalid: バリデーションに失敗しました: Cat postを入力してください
    from /Users/ayumiuchimura/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/activerecord-6.0.3.2/lib/active_record/validations.rb:80:in `raise_validation_error'
    [3] pry(#<CatPostCommentsController>)> @cat_post_comment.errors.full_messages
    => ["Cat postを入力してください"]
    [4] pry(#<CatPostCommentsController>)> @cat_post_comment
    => #<CatPostComment:0x00007fc6ba1fe540 id: nil, user_id: 1, cat_post_id: nil, cat_post_comment: "テスト", created_at: nil, updated_at: nil>
    [5] pry(#<CatPostCommentsController>)> 
    
[/code]

原因としてはcat_post_id:
nilがnilとなっているせいであることはわかったのですが、ストロングパラメーター部分のmerge記述方法をparams:cat_post_ids =>
[]に変更したり、mergeではなくpermitに記述をしたりしてみたのですが、記述方法がそもそも間違えているのかsyntaxエラーが起きてしまう状態で、そもそもshowのビューページまで遷移する事ができない状態となってしまっています。

どなたかお分かりになりましたら、教えて頂けますと幸いです。  
どうぞ宜しくお願い致します。


CC BY-SA 4.0
2020-08-20T14:09:53.423
69728
2020-08-21T02:22:21.617
41569
question
ruby-on-rails ruby
コメントをカラムに保存ができない


@ammmyy さん、こんにちは。

エラーの件は、保存の時点で `params[:cat_post_id]`がみつかっていないような挙動に見受けられたので、binding.pry したときに
`params`を出力してみて`cat_post_id`が確認してみてはどうでしょうか。

## create -> new

[code]

    @cat_post_comment = CatPostComment.create(cat_comment_params)
    
[/code]

createをつかうと、このメソッドの時点でDBへの保存が実行されてしまいます。  
newをつかうようにしてみてください。

[code]

    @cat_post_comment = CatPostComment.new(cat_comment_params)
    
[/code]

もうすこし踏み込むと、ここで作られるcat_post_commentはcurrent_userが持つデータになるとおもうので、Userモデルの関連をつかうとRailsらしくなります。

## 関連を使う方法

[code]

    @cat_post_comment = current_user.cat_post_comments.build(cat_comment_params)
    
[/code]

この書き方をした場合、`cat_comment_params`でuser_idをmergeする必要はなくなります。  
参考：[Active Record の関連付け -
Railsガイド](https://railsguides.jp/association_basics.html#has-
many%E3%81%A7%E8%BF%BD%E5%8A%A0%E3%81%95%E3%82%8C%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89-collection-
build-attributes)


CC BY-SA 4.0
2020-08-21T00:49:54.450
69741
2020-08-21T00:49:54.450
32317
69728
answer