mywork1868
@mywork1868

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

コメント機能をつけたいのにDBに保存されません。

解決したいこと

Ruby on Railsでフリマアプリをつくっています。
出品されている商品へのコメント機能をつけたいのですが、コメントを入力してもデータベースに保存されません。
解決方法を教えて下さい。
初めての質問なので、足りない情報などありましたらすみません。

発生している問題・エラー

エラー文は出ていません。

一応ターミナルのエラー文らしきものは以下になります。

Processing by ItemsController#show as HTML
  Parameters: {"authenticity_token"=>"lgPO6uesQkD9oKywOBFaAZFKNBbZrPSttUTXuh3LLgOldVaus8sMIE3LcLG192ZRSY60OBYWS3f2Bkqf+O1VLw==", "comment"=>{"text"=>"good"}, "commit"=>"コメントする", "id"=>"4"}
  Item Load (0.3ms)  SELECT `items`.* FROM `items` WHERE `items`.`id` = 4 LIMIT 1
  ↳ app/controllers/items_controller.rb:56:in `set_item'
  Rendering items/show.html.erb within layouts/application
  User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 ORDER BY `users`.`id` ASC LIMIT 1
  ↳ app/views/shared/_header.html.erb:18
  Rendered shared/_header.html.erb (Duration: 2.8ms | Allocations: 2853)
  ActiveStorage::Attachment Load (0.2ms)  SELECT `active_storage_attachments`.* FROM `active_storage_attachments` WHERE `active_storage_attachments`.`record_id` = 4 AND `active_storage_attachments`.`record_type` = 'Item' AND `active_storage_attachments`.`name` = 'image' LIMIT 1
  ↳ app/views/items/show.html.erb:10
  ActiveStorage::Blob Load (0.3ms)  SELECT `active_storage_blobs`.* FROM `active_storage_blobs` WHERE `active_storage_blobs`.`id` = 4 LIMIT 1
  ↳ app/views/items/show.html.erb:10
  Order Load (0.2ms)  SELECT `orders`.* FROM `orders` WHERE `orders`.`item_id` = 4 LIMIT 1
  ↳ app/views/items/show.html.erb:11
  User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
  ↳ app/views/items/show.html.erb:26
  Comment Load (0.2ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`item_id` = 4
  ↳ app/views/items/show.html.erb:104
  Rendered shared/_footer.html.erb (Duration: 1.8ms | Allocations: 2532)
  Rendered items/show.html.erb within layouts/application (Duration: 13.0ms | Allocations: 12896)
[Webpacker] Everything's up-to-date. Nothing to do
Completed 200 OK in 25ms (Views: 21.2ms | ActiveRecord: 1.9ms | Allocations: 34740)

該当するソースコード

comments_controller.rb

class CommentsController < ApplicationController

  def create
    @item = Item.find(params[:item_id])
    @comment = Comment.new(comment_params)
    if @comment.save
      redirect_to item_path(@comment.item)
    else
      render :show
    end
  end

  private
  def comment_params
    params.require(:comment).permit(:text).merge(user_id: current_user.id, item_id: params[:item_id])
  end
end

items_controller.rb


  def show
    @comment = Comment.new
    @comments = @item.comments.includes(:user)
  end

routes.rb

Rails.application.routes.draw do
  devise_for :users
  get 'items/index'
  root to: "items#index"
  resources :items do
    resources :comments, only: :create
    resources :orders, only: [:index, :create]
  end
end

show.html.erb

  <div class="comment-box">
    <% if user_signed_in? && @item.order.nil? %>
      <form>
        <%= form_with model: [@item, @comment], url: item_comments_path(@item), local: true do |f| %>
          <%= f.text_field :text ,class: "comment-text"%>
          <p class="comment-warn">
            相手のことを考え丁寧なコメントを心がけましょう。
            <br>
            不快な言葉遣いなどは利用制限や退会処分となることがあります。
          </p>
          <%= f.submit "コメントする", class:"comment-btn" %>
        <% end %>
      </form>
    <% elsif @item.order.present? %>
      <strong><p>※※※ この商品は売り切れています ※※※</p>
      </strong>
    <% else %>
      <strong><p>※※※ コメントの投稿には新規登録/ログインが必要です ※※※</p>
      </strong>
    <% end %>
    <div class="comments">
      <h4><コメント一覧></h4>
      <% @comments.each do |comment| %>
        <li class="comments_list">
          <%= comment.content %>
          <%= link_to "#{comment.user.name}", "#" %>
        </li>
      <% end %>
    </div>
  </div>

自分で試したこと

アソシエーションは確認しましたが、組めていました。
comments_controller.rbのdef create内でbinding.pryを試しましたが止まらず、商品詳細画面に戻ってしまいます。

0

1Answer

おそらくですがformタグが2重になっていることが原因ではないかと思います。
formタグが2重になっている場合、内側のformタグが削除されるのでsubmit処理で外側のformが発火しているのではないかという見立てです。
以下で解決する可能性があります。

<-- 省略 -->
- <form>
        <%= form_with model: [@item, @comment], url: item_comments_path(@item), local: true do |f| %>
          <%= f.text_field :text ,class: "comment-text"%>
          <p class="comment-warn">
            相手のことを考え丁寧なコメントを心がけましょう。
            <br>
            不快な言葉遣いなどは利用制限や退会処分となることがあります。
          </p>
          <%= f.submit "コメントする", class:"comment-btn" %>
        <% end %>
-       </form>
<-- 省略 -->
1Like

Your answer might help someone💌