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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

3596閲覧

【Ruby on Rails】ブログサイトでコメント機能の関連付けができません。

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails

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

0グッド

2クリップ

投稿2017/05/07 08:18

編集2017/05/08 06:58

###前提・実現したいこと
Ruby(Ruby on Rails)でブログサイトを作っています。
ログインユーザーがコメントをするような仕組みと想定しているのですが、どのようにして記事と関連づけるべきであるか迷っています。

ユーザーと記事に紐づいたコメントの登録を実装するうえで、表示されている記事にコメントを関連づけるためにはどうすればいいですか?

###該当のソースコード
・コメントコントローラー

Ruby

1class CommentsController < ApplicationController 2 3 def create 4 @comment = current_user.comments.build(comment_params) 5 if @comment.save 6 flash[:success] = "コメントが投稿されました!" 7 redirect_to root_path 8 else 9 @feed_items = [] 10 redirect_to root_path 11 end 12 end 13 14 def comment_params 15 params.require(:comment).permit(:content) 16 end 17end

・マイグレーションファイル

Ruby

1class CreateComments < ActiveRecord::Migration[5.0] 2 def change 3 create_table :comments do |t| 4 t.text :content 5 t.references :user, foreign_key: true 6 t.references :article, foreign_key: true 7 8 t.timestamps 9 end 10 add_index :comments, [:user_id, :article_id, :created_at] 11 end 12end

・コメントモデル

Ruby

1class Comment < ApplicationRecord 2 belongs_to :user 3 belongs_to :article 4 default_scope -> { order(created_at: :desc)} 5 validates :user_id, presence: true 6 validates :article_id, presence: true 7end

・ビュー

Ruby

1<%= form_for(@comment) do |f| %> 2 <%= render 'shared/error_messages', object: f.object %> 3 <div class="field"> 4 <%= f.text_area :content, placeholder: "コメントを入力する" %> 5 </div> 6 <%= f.submit "コメントする", class: "btn btn-primary" %> 7<% end %>

###試したこと
・ここからどうやって進めればよいのか見当がつかず、いっさい進められておりません。

###補足情報(言語/FW/ツール等のバージョンなど)
開発環境:Ruby on Rail 5.0.0.1

###追記情報(該当ソース)

・ビュー(articles/show.html.erb)

・・・ <section> <div class="title"> <h2>コメント</h2> <% if logged_in? %> <div class="row"> <aside class="col-md-4"> <section class="cooment_form"> <%= render 'shared/comment_form' %> </section> </aside> </div> <% else %> <div></div> <% end %> <%= render 'shared/feed' %> </section> ・・・

・ビュー(shared/comment_form)

Ruby

1 2<%= form_for(@comment) do |f| %> 3 <%= render 'shared/error_messages', object: f.object %> 4 <div class="field"> 5 <%= f.text_area :content, placeholder: "コメントを入力する" %> 6 </div> 7 <%= f.submit "Post", class: "btn btn-primary" %> 8<% end %>

・ビュー(shared/feed)

Ruby

1<%if @feed_items.any? %> 2 <%= render @feed_items %> 3 <%= will_paginate @feed_items %> 4<% end %>

・コントローラー(artcles/controller)

Ruby

1class ArticlesController < ApplicationController 2 before_action :comment_feed, only:[:show, :comment] 3 4 def show 5 end 6 7 def search 8 @articles = Article.paginate(page: params[:page]) 9 @categories = Category.all 10 end 11 12 def new 13 @article = Article.new(create_params) 14 end 15 16 private 17 18 def article_params 19 params.require(:space).permit(:title, :content) 20 end 21 22 def set_article 23 @article = Article.find(params[:id]) 24 end 25 26 def comment_feed 27 if logged_in? 28 @comment = current_user.comments.build 29 @feed_items = current_user.feed.paginate(page: params[:page]) 30 end 31 end 32end

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

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

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

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

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

moke

2017/05/08 03:14

まず、どこからそれを投稿するのですか?おそらくarticleからですよね、その場合、articles_controllerと投稿するフォームを埋め込む場所おそらくarticles/show.html.erbを晒してください
退会済みユーザー

退会済みユーザー

2017/05/08 06:59

ありがとうございます。お申し付けいただいた箇所を追記いたしました。
guest

回答1

0

ベストアンサー

特に何も考える事なく。
article show 内でarticle_idを取得してcommentに追加

ruby

1class ArticlesController < ApplicationController 2 before_action :comment_feed, only:[:show, :comment] 3 4 def show 5 @comment.article_id=@article.id 6 end 7 8 def search 9 @articles = Article.paginate(page: params[:page]) 10 @categories = Category.all 11 end 12 13 def new 14 @article = Article.new(create_params) 15 end 16 17 private 18 19 def article_params 20 params.require(:space).permit(:title, :content) 21 end 22 23 def set_article 24 @article = Article.find(params[:id]) 25 end 26 27 def comment_feed 28 if logged_in? 29 @comment = current_user.comments.build 30 @feed_items = current_user.feed.paginate(page: params[:page]) 31 end 32 end 33end

shared/comment_formに非表示でストア

ruby

1<%= form_for(@comment) do |f| %> 2 <%= render 'shared/error_messages', object: f.object %> 3 <div class="field"> 4 <%= f.text_area :content, placeholder: "コメントを入力する" %> 5 <%= f.hidden_field :article_id %> 6 </div> 7 <%= f.submit "Post", class: "btn btn-primary" %> 8<% end %>

commentのstrong_parameterを許可

ruby

1class CommentsController < ApplicationController 2 3 def create 4 @comment = current_user.comments.build(comment_params) 5 if @comment.save 6 flash[:success] = "コメントが投稿されました!" 7 redirect_to root_path 8 else 9 @feed_items = [] 10 redirect_to root_path 11 end 12 end 13 14 def comment_params 15 params.require(:comment).permit(:content,:article_id) 16 end 17end

でも、できますが。

このままだと、articleのページからtopページに戻ってしまいます。
commentをつけるのがarticleだけならば
redirect_to root_path

redirect_to article_path(@comment.article)
にすればいいのですが。

そうでない場合(記事以外にもコメントをつける場合)

ajaxにして、javascriptを使いページを読み込む事なくコメントだけ追加するか
nested_attribute_forを利用してarticle(や他のモデル)と同時にcommentを更新するのか
そもそもこのcomment_formを使い回すのは本当にDRYなのか
よく考えて実装してください。

投稿2017/05/08 08:47

moke

総合スコア2241

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

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

退会済みユーザー

退会済みユーザー

2017/05/10 07:50

ご丁寧にご対応いただき、まことにありがとうございます。 なんとかできました、 おっしゃるように、きちんと考えて実装するように心がけます。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問