🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

Q&A

解決済

2回答

1416閲覧

each do メソッドがなぜか2回繰り返されてしまい原因がわかりません

ma_k

総合スコア33

Ruby on Rails 5

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

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2019/09/13 01:51

編集2019/09/13 08:10

ruby on rails でアプリ開発をしています。

each do メソッドで繰り返しを表示したいのですが、

2回行われてしまい困っています。
繰り返し1回でいいので修正したいです。
原因と解決を探していますが未だにわかりません。

どなたかわかるかた教えていただけたら幸いです。

HTML

1 <div class="mypage-contents"> 2 <div class="tab_wrap"> 3 <input id="tab1" type="radio" name="tab_btn" checked> 4 <input id="tab2" type="radio" name="tab_btn"> 5 <input id="tab3" type="radio" name="tab_btn"> 6 <div class="tab_area"> 7 <% if @user.id == current_user.id %> 8 <label class="tab1_label" for="tab1">MYNOTE</label> 9 <label class="tab2_label" for="tab2">いいねのNOTE</label> 10 <% else %> 11 <label class="tab1_label" for="tab1"> 12 <%= @user.name %>のNOTE</label> 13 <% end %> 14 <% if @user.id == current_user.id %> 15 <label class="tab3_label" for="tab3">コメントしたNOTE</label> 16 <% end %> 17 </div> 18 <div class="panel_area"> 19 <div id="panel1" class="tab_panel"> 20 <% @note.each do |note| %> 21 <div class="mylist"> 22 <h2> 23 <%= link_to note.title, note, class: 'mylist-buttom' %> 24 </h2> 25 <% if @user.id == current_user.id %> 26 <div class="mylist-right"> 27 <% if @user.id == current_user.id %> 28 <p> 29 <%= link_to '編集 ', edit_note_path(note),class: 'mylist-buttom'%> 30 </p> 31 <p> 32 <%= link_to '削除', note, method: :delete, data: { confirm: 'Are you sure?' } ,class: 'mylist-buttom'%> 33 </p> 34 </div> 35 <% end %> 36 </div> 37 </div> 38 <% end %> 39 <% if @user.id == current_user.id %> 40 <div id="panel2" class="tab_panel"> 41 <% @goods.each do |good| %> 42 <div class="mylist"> 43 <% note= Note.find_by(id: good.note_id) %> 44 <h2> 45 <%= link_to(note.title, "/notes/#{note.id}") %> 46 </h2> 47 <div class="mylist-right"> 48 <p> 49 <%= link_to 'Show', note, class: 'buttom' %> 50 </p> 51 </div> 52 </div> 53 <% end %> 54 <% end %>a 55 </div> 56 <% if @user.id == current_user.id %> 57 <div id="panel3" class="tab_panel"> 58 <% @comments.uniq.each do |c| %> 59 <div class="mylist"> 60 <% c.body %> 61 <% note= Note.find_by(id: c.note_id) %> 62 <h2> 63 <%= link_to(note.title, "/notes/#{note.id}") %> 64 </h2> 65 <div class="mylist-right"> 66 <p> 67 <%= link_to 'Show', note, class: 'u-buttom' %> 68 </p> 69 </div> 70 </div> 71 <% end %> 72 <% end %> 73 <% end %> 74 </div> 75 </div> 76 </div> 77 </div>

controller

1 def show 2 @user = User.find_by(id: params[:id]) 3 @note = current_user.notes.all 4 @goods = Good.where(user_id:@user.id) 5 @comments = Comment.where(user_id:@user.id) 6 end

イメージ説明

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

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

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

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

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

guest

回答2

0

@goods の中身が2つ(以上)ありませんか?

投稿2019/09/13 01:56

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ma_k

2019/09/13 03:01

コメントありがとうございます。2つ以上、、、 定義の問題だと思い、、、、 <% note= Note.find_by(id: good.note_id) %> <%= link_to(note.title, "/notes/#{note.id}") %> を <%= link_to(good.note.title, "/notes/#{note.id}") %> にしてみましたが結果は同じでした。。。 重複して定義してしまってるということですか?
退会済みユーザー

退会済みユーザー

2019/09/13 03:05

本問題では Note(notes) は関係ありません。 controller では @goods = Good.where(user_id:@user.id) と書かれています。 user_id がたとえば 10 の人に該当する goods テーブルのレコードが、2つ(以上)ありませんか? なお、デバッグを行うために、binding.pry を挿入して @goods.size などと実行すると上記のことはすぐに分かります。
ma_k

2019/09/13 04:54

シークエルプロ確認しましたが、レコードは1つでした。 質問の文章の最後に画像添付しました。
guest

0

ベストアンサー

コードを見た限りだとeachが2回実行されているようなことはないと思います。
なぜそう考えたのでしょう。

each do メソッドがなぜか2回繰り返されてしまう

とはつまり以下の状態を指すのですが本当にこうなっていますか?

rb

1[1,2,3].each do |i| 2 p i 3end 4 51 62 73 81 92 103

例えば

# usersテーブル id ---- 1 2 # goodsテーブル id | user_id | note_id ------------------------ 1 | 1 | 1 2 | 1 | 2 3 | 1 | 1 4 | 2 | 1 # notesテーブル id ------ 1 2

のようなテーブルがあったとして今のコードだと

rb

1@user = User.find_by(id: 1) 2#=> {:id => 1} 3@goods = Good.where(user_id: @user.id) 4#=> [{:id => 1, :user_id => 1, note_id: 1}, {:id => 2, :user_id => 1, note_id: 2}, {:id => 3, :user_id => 1, note_id: 1}]

erb

1<% @goods.each do |good| %> 2 <% note= Note.find_by(id: good.note_id) %> 3<% end %>

ここでのnote

1回目: id == 1 の note 2回目: id == 2 の note 3回目: id == 1 の note

となりid == 1noteが複数回できてきます。
これをeachが複数回実行されたと勘違いされているのでは?

追記

一応確認しておきますが、あなたの書いたHTMLは以下のようなものです。
見易いよう必要なところだけ抜粋して、インデントがぐちゃぐちゃだったのでslimに直して整形してあります。

slim

1- @note.each do |note| 2 .mylist 3// ---------------------------------------------------------- 4 h2 = link_to note.title, note, class: 'mylist-buttom' 5 - if @user.id == current_user.id 6 .mylist-right 7 - if @user.id == current_user.id 8 p = link_to '編集 ', edit_note_path(note),class: 'mylist-buttom' 9 p = link_to '削除', note, method: :delete, data: { confirm: 'Are you sure?' } ,class: 'mylist-buttom' 10// ---------------------------------------------------------- 11 12 13- @goods.each do |good| 14 .mylist 15 - note = Note.find_by(id: good.note_id) 16// ---------------------------------------------------------- 17 h2 = link_to(note.title, "/notes/#{note.id}") 18 .mylist-right 19 p = link_to 'Show', note, class: 'buttom' 20// ---------------------------------------------------------- 21 22 23- @comments.uniq.each do |c| 24 .mylist 25 - note = Note.find_by(id: c.note_id) 26// ---------------------------------------------------------- 27 h2 = link_to(note.title, "/notes/#{note.id}") 28 .mylist-right 29 p = link_to 'Show', note, class: 'u-buttom' 30// ----------------------------------------------------------

見ての通り、似たようなものを3回に渡って行なっています。特に2つ目と3つ目は@comments@goodsの中身次第では全く同じになる可能性もあります。
まさかとは思いますが、そういう話ではないですよね?

投稿2019/09/13 05:19

編集2019/09/13 08:56
Mugheart

総合スコア2349

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

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

ma_k

2019/09/13 08:04

コメントありがとうございます。この原因パターンもあること初めて知りました。 勉強なります。なのですが、全く同じ内容で2回表示されてるので、違うような気がします。
Mugheart

2019/09/13 08:57

追記しました
ma_k

2019/09/14 09:24

追記ありがとうございます。まさかかも知れません。きっとそうだと思います。 ちょっと知識不足なので、いただいたコメント参考に出直してきます。
ma_k

2019/09/17 07:57

コメントを読み直し、検索をし、eachのそれぞれでしたい事を見直したらできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問