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

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

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

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

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

1661閲覧

Ruby on Railsのform_forについて

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2018/01/24 15:54

編集2018/01/24 16:01

コメント付きブログを開発しております。Railsのform_forについて質問があります。
コメントに返信をする機能を実装しておりますが、返信のフォームがなかなか上手く実装できません。
色々と試しましたが、解決できなかったので、教えて頂けますと幸いです。

【問題点】
返信用のtext_areaに親のコメントのcontent(内容)がデフォルトで入ってしまう点。
デフォルトで入ったcontent(内容)を削除して、入力したら正しく返信できるが、最初から返信用のtext_areaを空の状態にしたい。

Comment.rb # id :integer not null, primary key # user_id :integer not null # post_id :integer not null # content :text # created_at :datetime not null # updated_at :datetime not null # deleted_at :datetime # reply_id :integer belongs_to :user belongs_to :post # 返信 has_many :replies, class_name: 'Comment', foreign_key: :reply_id, dependent: :destroy # reply_idがnilなら親コメント scope :parent_comment, -> { where(reply_id: nil) }
comment_controller.rb # 返信用のメソッド def reply @post = Post.find(params[:post_id]) @comment = @post.comments.find(params[:id]) @reply = @comment.replies.new(comment_params) @reply.user_id = current_user.id @reply.post = @post if @reply.save redirect_to @post, notice: "返信しました" else redirect_to @post, notice: "返信出来ませんでした。" end end
posts/show.html.slim - if @post.comments.present? - @post.comments.parent_comment.each do |comment| p.commenter_name = comment.user.try(:name) p.comment.content = comment.content - comment.replies.each do |reply| p.comment.content = reply.content = form_for [:reply, @post, comment], method: :post do |form| p = form.text_area :content, rows: 3, cols: 35 # ↑ここのtext_areaに最初から親コメントのcontent(内容)が入った状態になってしまいます p = form.submit "上記の内容で返信する"

色々と試してみましたが、上手くいきませんでした。どなたか教えていただけないでしょうか?宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

パラメーターを少し操作するといいと思います。この辺は理解が難しいですよね。
例えば以下実装にします

posts/show.html.slim

html

1<!-- :contentを使うと親の@comment.contentの値をセットしてしまうので、別名にします --> 2= form.text_area :reply_content, rows: 3, cols: 35

comment_controller.rb

ruby

1def reply 2 @post = Post.find(params[:post_id]) 3 @comment = @post.comments.find(params[:id]) 4 @reply = @comment.replies.new(comment_params) 5 # 以下追加部分 replyのcontentにはhtml側でセットしたreply_contentを使用する 6 @reply.content = params[:reply_content] 7 @reply.user_id = current_user.id 8 @reply.post = @post 9 if @reply.save 10 redirect_to @post, notice: "返信しました" 11 else 12 redirect_to @post, notice: "返信出来ませんでした。" 13 end 14end

comment.rb

ruby

1class User < ActiveRecord::Base 2 # 以下を追加 3 attr_accessor : reply_content 4end

その他、form_tagやnested_attributesを使うなどあります。
リファクタリングできれば、本当はそっちのほうがいいかもしれませんが、改修箇所が多くなってしまい面倒ですね。。。

投稿2018/01/26 03:11

編集2018/01/26 13:21
h_daido

総合スコア824

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

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

退会済みユーザー

退会済みユーザー

2018/01/26 12:36 編集

ご回答ありがとうございます! 教えて頂いたように実装いたしますと、Commentのモデルにはreply_contentというカラムが存在しませんので「undefined method `reply_content' for #<Comment:0x007fa97602c2f0> Did you mean? reply_change」のようなエラーが出ます。 返信用のカラムは「reply_content」という別のカラムを用意した方が良いのでしょうか?
h_daido

2018/01/26 13:17

あ、そうでした。失礼しました。 DBには保存する必要ないので、attr_accessorを使うとよいと思います。回答を修正しておきます。
退会済みユーザー

退会済みユーザー

2018/01/26 14:49 編集

何度も申し訳ありません! Comment.rbに以下を追加いたしました。 attr_accessor :reply_content そうすると、エラーは無くなりましたが、contentがnilになってしまい返信が保存されません。 ストロングパラメーターは以下のようにしております。 def comment_params params.require(:comment).permit(:content, :reply, :reply_content) end 何故でしょうか? よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2018/01/26 22:27 編集

アドバイス頂いた @reply.content = params[:reply_content]の部分を以下のように変更すると正確に動きました! @reply.content = @reply.reply_content @reply.content = params[:reply_content]でも良さそうですが、何故でしょうか?
h_daido

2018/01/28 04:01

とりあえず動いたようでよかったです! すいません、paramsでうごかいない理由については把握できてないです...。各パラメーター値などデバッグしてみるとわかるかもしれないですね!
退会済みユーザー

退会済みユーザー

2018/01/28 11:07 編集

いえ、ご丁寧に色々とありがとうございました!!! デバックなどもやってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問