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

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

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

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

Ruby on Rails

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

Q&A

1回答

573閲覧

【Rails】コメントを投稿別に振り分ける方法

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Ruby on Rails

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

0グッド

0クリップ

投稿2018/02/24 08:52

コメント機能を実装したいと思っています。
各投稿欄にコメントフォームを設置し、そこからコメントすることで該当する投稿にコメントがされるというものです。

例)
投稿1
コメント投稿数 (0)
[コメントフォーム]


投稿2
コメント投稿数 (1)
[コメントフォーム] ←このフォームで送信することで、投稿2にコメントするようなシステム


投稿3
コメント投稿数 (0)
[コメントフォーム]

投稿(Twiモデル)との関連付けがうまくいかず悩んでいます。
(具体的には、外部キーのtwi_idをどのように格納すれば良いか分かりません・・・)

解決策、改善案お持ちの方、ご助力をお願いいたします。
各コード情報は以下となります。

モデルのアソシエーション

User.rb has_many :twis belongs_to :comment Twi.rb has_many :comments belongs_to :user Comment.rb belongs_to :user belongs_to :twi

投稿一覧ページ(Twis/index)

<% @twis.each do |t| %> <%= t.user.name %> <%= t.msg %> <%= t.comment.count %> <%= render 'comments/form', comment: @comment, id:t.id %> <% end %>

TwiController (indexアクション)

def index users = User.where 'account_id == ?', current_account.id if users[0] == nil then user = User.new user.account_id = current_account.id user.save users = User.where 'account_id == ?', current_account.id end @user = users[0] @twis = Twi.page(params[:page]).order(created_at: :desc) @comment = Comment.new @comment.user_id = @user.id end

CommentController

def new users = User.where 'account_id == ?', current_account.id if users[0] == nil then user = User.new user.account_id = current_account.id user.save users = User.where 'account_id == ?', current_account.id end @user = users[0] @comment = Comment.new @comment.user_id = @user.id end def create @comment = Comment.new(comment_params) respond_to do |format| if @comment.save format.html { redirect_to '/twis', notice: 'Comment was successfully created.' } format.json { render :show, status: :created, location: @comment } else format.html { render :new } format.json { render json: @comment.errors, status: :unprocessable_entity } end end end def comment_params params.require(:comment).permit(:body, :twi_id, :user_id) end

投稿フォーム(comments/_form.html.erb)

<%= form_with(model: comment, local: true) do |form| %> <% if comment.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(comment.errors.count, "error") %> prohibited this comment from being saved:</h2> <ul> <% comment.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= form.text_area :body, id: :comment_body %> <%= form.submit '送信' %> <%= form.hidden_field :twi_id, id: :comment_twi_id %> <%= form.hidden_field :user_id, id: :comment_user_id %> </div> <% end %>

投稿一覧ページ(Twis/index)の変数tをフォームと関連付けられれば早いと思うのですが・・・

何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

投稿一覧ページの @twis.each do |t| のループの中で,同じ @comment を使いまわしているのがおかしいですね。
render 'comments/form' に与える comment の値を,このループ内で生成すればいいと思います。(TwisControllerindex アクションでは生成しない)


以下,本題とは関係なく気になった点。

User モデルで

rb

1belongs_to :comment

はおかしいですね。has_many :comments の間違いでは。

TwisControllerindex アクションの

rb

1User.where 'account_id == ?', current_account.id

rb

1User.where account_id: current_account.id

でいいのでは。
(もっと簡潔に書けそうですが,current_account が何者か分からないので)

rb

1if users[0] == nil then

は,今の場合

rb

1if users.empty?

と書けます。

投稿2018/02/24 22:54

scivola

総合スコア2108

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

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

退会済みユーザー

退会済みユーザー

2018/02/25 04:54

scivolaさん ご回答頂きありがとうございます。 ループ内で生成というのはこのような形でしょうか。 <% @twi_comment = Comment.new %> <% @twi_comment.twi_id = t.id %> <%= render 'comments/form', comment:@twi_comment, id:t.id %> <% end %> <% end %> 的外れなものでしたら申し訳ありません・・・ その他アドバイスも多数頂きありがとうございます。 早速修正させて頂きました。 追記 AccountはDevise認証のモデル名です。 省略した為混乱を招きすみませんでした。 Userモデルのアソシエーションはteratailでの記述ミスでした。 こちらも余計なご心労をおかけしてすみませんでした。
scivola

2018/02/25 09:44

そうですね,そういう形です。(結果はどうでしたか?) ただ,ここで @twi_comment とインスタンス変数を用いるのは適切でなく,ローカル変数を用いるべきでしょう。 また,Comment オブジェクトを生成したあとで @twi_comment.twi_id = t.id としなくても,最初から twi_comment = Comment.new twi_id: t.id とすれば簡潔ですね。
退会済みユーザー

退会済みユーザー

2018/03/01 02:56

お返事遅くなり大変申し訳ありませんでした。 簡略したコードの書き方ご指導頂きありがとうございます。 <% twi_comment = Comment.new twi_id: t.id %> <%= render 'comments/form', comment: twi_comment, id:t.id %> <% end %> で試したところ<% end %>がいらないと表示され、 <% end %>を抜いたところこのコードとは関係ない上部にあったコードに問題があると指摘を受けました(詳しくは下記コードです) <table style="margin-top:10px;"> <tr> <th class="icon"><%= link_to (image_tag t.user.image.url), controller: :users, action: :show, id:t.user_id %></th> <th class="icon-name"><%= t.user.name %></th> </tr> </table> 結果↓ undefined method `image' for nil:NilClass <%= render 'comments/form', comment: twi_comment, id:t.id %> の comment: twi_comment 部分を comment: @comment と元に戻すと問題なく表示することができます・・・
scivola

2018/03/01 23:08

まず「<% end %>がいらないと表示され」の件ですが,この <% end %> は <% @twis.each do |t| %> に対応するもののはずよね。 であれば抜いてはいけません。 要るはずの end が余計だと言われたのなら,どこか書き間違えているはず。 テンプレートの全体を見せていただければ分かると思います。 次に「undefined method `image'」の件ですが,ビューのこの箇所はいま取り組んでいる問題とは独立性が高いので,切り離して考えるのがいいでしょう。 とりあえずこのコードを削除しましょう(もちろんどこかに保存しておきます)。 そして当初の問題をまずは解決しちゃいましょう。
scivola

2018/03/03 22:29

erb ファイルって,ちょっと複雑になると,埋め込んだ Ruby コードの制御構造の対応がよくわかんなくなってきますよね。 そんなとき,erb テンプレートの構文をチェックするツールが使えます。 erubis っていう gem は入ってますか? これは最近まで Rails の標準の erb テンプレートエンジンでした。(現在の Rails では,erubi という別の gem になっていますが) erubis が入ってなければ gem install erubis で入れてください。 erubis は erb テンプレートの処理をするライブラリーですが,同名の erubis というコマンドも提供していて,このコマンドで構文チェックなどいろいろなことができます。 erubis -z app/views/items/edit.html.erb みたいに,-z オプションをつけてテンプレートファイルのパスを与えると構文チェックしてくれます。 これが今回の件に役立つかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問