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

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

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

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

Q&A

解決済

3回答

472閲覧

コメント機能でUrlGenerationError

yuya555555

総合スコア64

Ruby on Rails 6

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

0グッド

0クリップ

投稿2022/07/15 09:18

開発環境

rails 6.1.6
cloud9

やりたいこと

コメント機能の実装

現状

投稿一覧から投稿詳細ページに遷移しようとすると以下のエラーが出ます。イメージ説明

エラー周りのコード

post/show

1 <div class="comment-form"> 2 <%= form_with model: [@post, @comment], url: user_post_comments_path, local: true, method: :post do |f| %> 3 <%= f.text_area :comment_content, placeholder: "コメント記入欄" %><br/> 4 <%= f.submit "コメント" %> 5 <% end %> 6 </div>

post/controller

1class PostsController < ApplicationController 2 def new 3 @post = Post.new 4 @categories = Category.all 5 end 6 7 def create 8 @post = Post.new(post_params) 9 @post.user_id = current_user.id 10 if @post.save 11 end 12 redirect_to user_posts_path 13 end 14 15 def edit 16 @post = Post.find(params[:id]) 17 @categories = Category.all 18 end 19 20 def index 21 @posts = Post.all 22 end 23 24 def show 25 @post = Post.find(params[:id]) 26 @user = @post.user 27 @comment = Comment.new 28 end 29 30 def destroy 31 @post = Post.find(params[:id]) 32 @post.destroy 33 redirect_to user_posts_path 34 end 35 36 def update 37 @post = Post.find(params[:id]) 38 end 39 40 def search 41 @posts = Post.joins(:post_categories).where('post_categories.category_id = ?', params[:name]) 42 render :index 43 end 44 45 private 46 def post_params 47 params.require(:post).permit(:place_name, :body, :latitude, :longitude, :image, :name, category_ids: []) 48 end 49 50end

comments/controller

1class CommentsController < ApplicationController 2 3 4 def create 5 @post = Post.find(params[:id]) 6 comment = current_user.comments.new(comment_params) 7 comment.post_id = post.id 8 comment.save 9 redirect_to post_path(post) 10 end 11 12 def destroy 13 14 end 15 16 private 17 18 def comment_params 19 params.require(:comment).permit(:comment_contents) 20 end 21end 22

routes.rb

1 resources :users, except: [:new, :destroy] do 2 resources :posts do 3 resources :comments, only: [:create, :destroy] 4 end 5 end

詳細について

中間テーブルとしてcommentsテーブルがあります。
ネストさせているため、form_withでモデルを複数指定しており、URL指定していなければNoMethodError in Posts#show undefined method `post_comments_path' forと別のエラーが起きます。

原因が分かる方いらっしゃいましたら、ご教授いただければ幸いです。

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

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

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

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

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

guest

回答3

0

これは私がこの新しい分野を理解するために探しているものなので、この情報をもっと早く知りたかったと思います。 driving directions

投稿2023/06/21 03:26

karausa

総合スコア8

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

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

0

自己解決

引数を明示的に記載すると正常に動きました。

投稿2022/07/27 04:23

yuya555555

総合スコア64

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

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

0

<%= form_with model: [@post, @comment], url: user_post_comments_path,

<%= form_with model: [@post, @comment],
にしてみて

ああ、urlつけないとエラーなのね
え?
post_comments_path でなく user_post_comments_path ?
なら

<%= form_with model: [current_user, @post, @comment],

投稿2022/07/15 10:24

編集2022/07/15 10:30
winterboum

総合スコア23347

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

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

yuya555555

2022/07/15 10:35

winterboumさん ご返答ありがとうございます。 頂いた記述を試してみましたが、以下のエラーとなりました。(※local:true, method: :postの記述は書いても書かなくてもエラーに変わりありませんでした) 引数の@postを → @post.idとしてもidはnilでかえってきます。 ActionController::UrlGenerationError in Posts#show No route matches {:action=>"create", :controller=>"comments", :post_id=>nil, :user_id=>"14"}, missing required keys: [:post_id]
winterboum

2022/07/15 10:52

投稿済の @post に commentをつけるってことだよね? だったら @postが決まってるはずだが。 def show @post = Post.find(params[:id]) で実在しない id わたしてない?
yuya555555

2022/07/15 11:02

その可能性もあるかとおもいます。 一旦、Postの中身を全て削除して、投稿し直してみます。
yuya555555

2022/07/15 11:08

変化がみられませんでした。 No route matches {:action=>"create", :controller=>"comments", :post_id=>nil, :user_id=>"16"}, missing required keys: [:post_id]
winterboum

2022/07/15 11:55

postのshowなのに postの情報が全く表示されてないのが ??? なのですが。。 form ~ end を消して替わりに @post の中身を表示されると、表示できますか?
yuya555555

2022/07/15 13:07

def showにbyebugを置き、投稿詳細リンクをクリックし、@postの中を見ると以下のようになりました。 (byebug) @post #<Post id: 16, user_id: 2, category_id: nil, place_name: "銀座", latitude: 35.6712228, longitude: 139.7664859, created_at: "2022-07-15 11:05:58.076739000 +0000", updated_at: "2022-07-15 11:05:58.128818000 +0000", body: "銀座の交差点", address: nil>
yuya555555

2022/07/27 04:22

引数を明示的に記載すると正常に動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問