SNSっぽいアプリケーションのマイページで、ログイン中ユーザの投稿一覧を取得したかっただけなのにかなり詰まったので備忘録として残しておきます。
アプリの仕様上showアクションやshow.html.erbファイルを使用できず、index.html.erbで表示させるというレア?パターンではありますが。
環境
Rails 5.2.3
Ruby 2.5.1
gemのdeviseを使用
当記事で使用しているモデル名はplace
詰まった所
homes/index.html.erbファイル内にてeach doを利用し投稿内容を全部出力したい。
<% @myplaces.each do |myplace| %>
#省略
<% end %>
全部のplaceを取得するのはhomesコントローラー内のindexアクションで
@places = Place.all
こう書けばいい。そりゃそうだ。
問題はログイン中ユーザの投稿内容だけを取得したい時。
@myplaces = Place.find(current_user.id)
と入力するとundefined method 'each' for nil:NilClassでエラーが発生する。これは@myplacesが空だからeachする元ネタがありませんよっていう怒られ方。できそうな気もするのに。
試しにターミナルでfind(1)として出力してみる。
pry(main)> Place.find(1)
(0.5ms) SET NAMES utf8, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
Place Load (0.3ms) SELECT `places`.* FROM `places` WHERE `places`.`id` = 1 LIMIT 1
=> #<Place:0x00007f831ad85618
id: 1,
name: #以下省略
問題ない。
idが1であるcurrent_user.idを適当な変数に代入して出力してみる
@user = current_user.id
<%= @user %>
# => 1
こっちも問題がない。
なんで出力されないのか不思議で仕方がなかったんですが、驚いた事にこんな書き方だけで解決しました。
@places = Place.all
places = @places
@myplaces = current_user.places
<% @myplaces.each do |myplace| %>
#省略
<% end %>
目ン玉飛び出そうになりました。こんな簡単な記述でよかったんかと。。。普通にidを指定すれば出来るやろって余裕こいてたら痛い目見ました。
原因は今度時間を見つけて探してみます。今度作る時にはハマらないように…