Hitsuji_monのブログ~ 村上春樹のあれ ~

文学好きな組み込み系エンジニア

ユーザ専用掲示板画面 | eachには配列を渡そう

eachで取り出す対象は「オブジェクトじゃダメ。配列で渡そう」

Before: エラー時
boards_controller.rb

# boards_controller.rb
~~
    def index_personal
        @boards = params[:tag_id].present? ? Tag.find(params[:tag_id]).boards : Board.find_by(user_id: @current_user)
    #  @boards = @boards.page(params[:page])
        binding.pry
    end
~~

index_personal.html.erb

# index_personal.html.erb
~~
<% @boards.each do |board| %>
    <tr>
      <td><%= board.id %></td>
      <td><%= board.title %></td>
      <td><%= board.name %></td>
      <td><%= board.created_at.to_s(:datetime_jp) %></td>
      <td><%= board.updated_at.to_s(:datetime_jp) %></td>
      <td><%= link_to '詳細', board, class: 'btn btn-outline-dark' %>
      <td><%= link_to '削除', board, class: 'btn btn-outline-dark', method: :delete %>
    </tr>
  <% end %>
~~

エラーメッセージ(&お気持ち)

ActiveRecordを使ってデータにアクセスすると、user_idでフィルターされたデータがちゃんと@boardsに渡されていた。
しかしview側では, eachメソッドが未定義だと言われる。なんでってなった。

NoMethodError in Boards#index_personal
Showing /app/app/views/boards/index_personal.html.erb where line #35 raised:

undefined method `each' for #<Board:0x00007fcf4e39f010>

After: 解決時ver!

# boards_controller.rb
~~
    def index_personal
        @boards = params[:tag_id].present? ? Tag.find(params[:tag_id]).boards : Board.where(user_id: @current_user)  
    #  @boards = @boards.page(params[:page])
        binding.pry
    end
~~
# index_personal.html.erb

# 同じなので略


eachにオブジェクトは渡さない

eachには配列で渡す。そうしないと一つ一つを取り出してループ変数に格納できない

  • find_by(カラム名: データ) : オブジェクトとして結果が格納
  • where(カラム名: データ) : 配列として結果が格納 こっち!!

これでユーザごとにMy掲示板を表示できたわ!!!!

qiita.com