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

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

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

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

Q&A

1回答

1214閲覧

投稿へのコメント機能

miiichat

総合スコア72

Ruby on Rails

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

0グッド

0クリップ

投稿2019/08/15 07:27

編集2022/01/12 10:55

###はじめに
掲示板の投稿のようなものをつくってます。
Post(id,user_id,title,text,parent_id)
parent_idが
nil->投稿
nilじゃない->コメント
っていうかんじで考えてます。

class Post < ApplicationRecord has_many :comments, class_name: "Post", foreign_key: "parent_id" belongs_to :post, optional: true, foreign_key: "parent_id" end

投稿の個別ページ(show.html.erb)でコメントできるようにしたいです。

###わからないこと
このやり方で会ってますか?
@post = Post.find(params[:id])
@comment = Post.new

あと、

f.hidden_field(:parent_id, :value => @post.id)は
params[:comment][:parent_id]で取れますか?

posts/show.html.erb

<h4><%= @post.title%></h4> <h4><%= @post.body%></h4> <%= form_for(@comment, url: posts_comments_url) do |f| %> <div class="field"> <%= f.label :body %> <%= f.text_field :body %> <% f.hidden_field(:parent_id, :value => @post.id)%> <%= f.submit "コメント" %> </div> <% end %>
class PostsController < ApplicationController def index @posts = Post.all end def new @post = Post.new end def create @post = Post.new(post_params) if @post.save flash[:info] = "投稿に成功しました" redirect_to posts_url else render 'new' end end def show @post = Post.find(params[:id]) @comment = Post.new end def comment_create @comment = Post.new(comment_params) @comment.attribute = { parent_id: params[:post][:parent_id] } if @comment.save flash[:info] = "コメントの投稿に成功しました" redirect_to post_url(params[:post][:parent_id]) else render 'new' end end private def post_params params.require(:post).permit( :title, :body) end def comment_params params.require(:post).permit(:body, :parent_id) end end

###追記
間違ってました。
×<% f.hidden_field(:parent_id, :value => @post.id)%>
〇<%= f.hidden_field(:parent_id, :value => @post.id)%>

"post"=>{"body"=>"test", "parent_id"=>"1"}, "commit"=>"コメント"}
なのでparams[:post][:parent_id]です。

@post = Post.find(params[:id])
@comment = Post.new

このやり方で大丈夫ですか?ほかの方法があったりしますか?

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

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

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

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

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

guest

回答1

0

これで良いと思います。なにかうまく行かなかったですか?

ほかの方法があったりしますか?

TMTOWTDI なrubyですから、色々有るといえばあります。
例えばここ
@comment = Post.new(comment_params)
@comment.attribute = { parent_id: params[:post][:parent_id]

post = Post.find(params[:post][:parent_id])
@comment = post.comments.build(comment_params)
type数はあまり変わりませんが、
「既に存在しているpost」の「関連」を作るのだよ
というのが一目でわかるので、あとから読む人に優しいかも。

投稿2019/08/15 23:42

winterboum

総合スコア23284

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問