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

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

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

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

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

Ruby on Rails 6

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

Q&A

解決済

1回答

1755閲覧

railsでコメント投稿欄を表示させて、コメント一覧が見えるようにしたい

ochibi1

総合スコア1

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

Ruby

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

Ruby on Rails 6

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

0グッド

1クリップ

投稿2020/07/20 11:21

編集2020/07/20 11:31

#前提
ruby 2.6.5
rails 6.0.0
上記の環境で、ブログアプリ作成中です。投稿の編集画面で、コメントの投稿・表示をさせたいです。
#解決したいこと
articleのshow画面で、コメント投稿欄を表示させたいのですが、該当コードの記述では、「NoMethodError in Articles#show 
Showing /Users/laflora/projects/game_plan/app/views/articles/show.html.haml where line #25 raised:

undefined method model_name' for nil:NilClass」というエラーが表示されてしまいます。 おそらく、model名を読み取れていないためのエラーだと考えています。 rails c でComment.createを試してみると、commentのidが生成されていないのが、エラーにも関係あるのでは、、と思うのですが、解決策が思い付かず、お力添えをお願いしたいです。。 #該当コード(ターミナル) views/articles/show.html.haml`

.container %h1.text-center = @article.title .row .col .col-md-6.mx-5 - if @article.img_id.present? = image_tag attachment_url(@article, :img), alt: '', height: '500px', width: '500px' - else = image_tag 'background.jpg', alt: '', height: '500px', width: '500px' %br %p.text-weight-bold = @article.body %br %p.text-right = l @article.created_at, format: :short %br = link_to '投稿の編集', edit_article_path(@article), class: 'btn btn-primary' = link_to '投稿を削除', article_path(@article), method: :delete, data: {confirm: "投稿を削除してもよろしいですか?" }, class: 'btn btn-danger' .col .row.bg-white.text-dark.mt-2 .col .col-md-6.mx-5 コメント機能の投稿欄 = form_with model: [@article, @comment] do |f| = f.text_area :text %br = f.submit "送信" .col

comments_controller.rb

class CommentsController < ApplicationController def create @comment = Comment.new(comment_params) @comment.user_id = currnet_user.id @comment.article_id = article.id if @comment.save redirect_to "/articles/#{comment.article.id}" else redirect_to root_path end private def comment_params params.require(:comment).permit(:text) end end

ターミナル

[7] pry(main)> Comment.create(user_id:"1", article_id:"1", text:"aaaaaaa") (0.7ms) BEGIN User Load (0.8ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 (2.0ms) ROLLBACK => #<Comment:0x00007fd39da5a230 id: nil, user_id: 1, article_id: 1, text: "aaaaaaa", created_at: nil, updated_at: nil> [8] pry(main)> Comment.create!(user_id:"1", article_id:"1", text:"aaaaaaaaa") (0.2ms) BEGIN User Load (0.8ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1 (3.1ms) ROLLBACK ActiveRecord::RecordInvalid: バリデーションに失敗しました: Aticleを入力してください from /Users/laflora/.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'

#試したこと
・comments_controller.rbのcreateアクションに、@comment.article_id = article.idを追加。
・Comment.createが働くかrails cで確認(該当コード参照)
・form_with model: [@article, @comment] do |f|を、form_with url root_path do |f|に変えてリロード→結果:フォーム画面は表示させられましたが、投稿はできなかったです。
#備考

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

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

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

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

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

guest

回答1

0

ベストアンサー

= form_with model: [@article, @comment] do |f| の @articleが未定義のためのエラーに見えます。show アクションのcodeを追加してください。

ただ create にもおかしな所が
def create @comment = Comment.new(comment_params) @comment.user_id = currnet_user.id @comment.article_id = article.id
article.id のところでエラーになりませんか?
articleはどこで定義してあります?

投稿2020/07/20 12:26

winterboum

総合スコア23347

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

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

ochibi1

2020/07/20 12:40

お忙しい中、返答有難うございます!! comments_controller.rbにはshowアクションを定義していないのですが、以下のように記述を加えると、articleのshow画面に、フォーム投稿欄は表示されるようになりました。 `articles_controller.rb` ``` def show @article = Article.find(params[:id]) @user = @article.user @comment = Comment.new @comments = @article.comments.includes(:user) end ``` が、ご指摘の通り、article.idの部分で「undefined local variable or method `article' for #<CommentsController:0x00007fb085ad1cf8> Did you mean? article_url」というエラーが出ていたところでした。article定義していないのが原因だったのですが、Comment.createするときのarticle.idの持たせ方が理解できておらず、詰まっています。
winterboum

2020/07/20 13:16

そのcommentはどれかのarticleをみてそれにつけるわけですから、commentのcreateにarticel_idを渡すのは易しいのでは? というかもう渡っているように見えるのですが = form_with model: [@article, @comment] do |f| ですから、showで@articleを渡すようにすれば。 logを見てください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問