質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1425閲覧

Rails7 form_withのmodelの設定方法

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2022/03/10 06:38

ruby 3.1.0, rails 7.0.2.2の環境下でsnsの様なアプリを開発中です。

userが投稿したmicropostにcomment機能をつける際に以下の様なエラーメッセージが出現しました。

イメージ説明

以下関係していると思われるcodeです

routes.rb

1 resources :microposts do 2 resources :comments, only:[:create] 3 end

migrate/create_comments.rb

1class CreateComments < ActiveRecord::Migration[7.0] 2 def change 3 create_table :comments do |t| 4 t.string :comment 5 t.references :user, null: false, foreign_key: true 6 t.references :micropost, null: false, foreign_key: true 7 8 t.timestamps 9 end 10 end 11end 12

user.rb

1 has_many :comments, foreign_key: "user_id", dependent: :destroy

micropost.rb

1 has_many :comments, foreign_key: "micropost_id"

comment.rb

1 belongs_to :user 2 belongs_to :micropost

microposts_controller.rb

1 def show 2 @user = current_user 3 @micropost = Micropost.find_by(id: params[:id]) 4 @comments = @micropost.comments 5 @comment = @micropost.comments.new 6 end

comments_controller.rb

1 def create 2 @comment = current_user.comments.new(comment_params) 3 4 respond_to do |format| 5 if @comment.save 6 format.html { redirect_to root_path} 7 else 8 format.html { render root_path, status: :unprocessable_entity} 9 format.json {render json: @comment.errors, status: :unprocessable_entity } 10 end 11 end 12 end 13 14 private 15 def comment_params 16 params.require(:comment).permit(:comment_content, :post_id) #formにてpost_idパラメータを送信して、コメントへpost_idを格納するようにする必要がある。 17 end

_micropost.html.erb

1<% if controller_name == "microposts" && action_name == "show"%> 2 <% @comments.each do |c| %> 3 <%= c.comment%> 4 <% end %> 5 6 <%= form_with(model: @comment, local: true) do |form| %> 7 <%= form.text_field :comment, class: "block bg-red-50"%> 8 <%= form.submit "add comment" %> 9 <% end %> 10<% end %>

micropostのparcialはindexなどでも使っているのでif文でコメントが表示される条件を指定しています。

@commentに正しい値が入っていないことが原因かと思うのですが、具体的に何がいけないのかがわかりません。

アプリの仕様としましては、全てのユーザーが全ての投稿にコメントした人の情報とともにコメントできる様にしたいです。

よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

このアプリがリリースされる日を楽しみにしています。 多くの興味深い機能が搭載されることを期待しています。 slope

投稿2023/12/18 02:10

sarausa

総合スコア6

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

form_with(model: [@micropost, @comment], local: true)

としてみてください。

エラーの原因は comments_path が存在しないからです。

undefined method comments_path

xxx_path は routes.rb から生成されます。
どんなパスが生成されているかは$ bin/rails routesで確認できます。
一番左のPrefix の値に _path を付けたやつが存在するやつです。

おそらく、micropost_comments は存在すると思われます。
form_with から呼ばれるパスを micropost_comments_path にするには、

form_with(model: [@micropost, @comment], local: true)

です。

@commentに正しい値が入っていないことが原因

今回はこれが原因ではありませんが、@comment が新規なのか既存なのかでform_with の振る舞いが変わります。 
新規の場合はcreateのパス POST comments_path
既存の場合はeditのPATCH comment_path(@comment) になるはずです。

投稿2022/03/11 15:23

neko_daisuki

総合スコア2090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/03/13 21:21

neko_daisukiさん回答のほどありがとうございました。 無事に提案いただいた方法で思い通りの挙動を実現することができました。 また原因についても詳しく教えていただきさらに理解が深まりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問