投稿一覧にもユーザー情報を表示しよう
<img src="<%= "/user_images/#{post.user.image_name}"%>">
.
.
.
<img src="<%= "/user_images/#{post.user.image_name}"%> ">
で成功した。
ところで
""で2重に囲む理由とはなんなのか?
外側の""
で文字列として扱うのだからいいじゃないか。
srcはパスを表すために""で囲んで文字列にするのはわかる。
ではなぜ
<%= %>
で囲む時も""を囲んで文字列にするのか?わからない。
<%= %>
とは何か
<%= %>
はrubyの文を実行するためのタグ
答えは出なかった。
しかし推測ならできた。
<%= %>
で囲む理由は#{}の式展開(ruby)を使うため。
<%= %>
の中で””
で囲む理由は式展開が""
で囲まれないとただの文字列として扱われてしまうため。
以上のより
""
を2重で囲む必要があると思う。
imgタグのsrcの値に、正しい値を追加してください
<img src="<%= "/user_images/#{post.user.id}" %>">
<img src="<%= "/user_images/#{post.user.image_name}" %>">
カラムの名前が間違っていた。
ユーザー詳細ページに投稿を表示しよう(1)
find_by
このメソッドではその条件に合致するデータを「1件だけ」取得することができる
whereメソッド
ある条件に合致する「複数の」データを取得する
whereメソッドでデータを取得した場合、それぞれのデータは配列に入っています。
rails consoleでWhere
を使う。
[1] pry(main)> posts = Post.where(user_id: 1)
Post Load (0.1ms) SELECT "posts".* FROM "posts" WHERE "posts"."user_id" = ? [["user_id", 1]]
=> [#<Post:0x000055dbbbf62ba0
id: 1,
content: "hogehoge\r\n",
created_at: Mon, 16 May 2022 14:25:03 JST +09:00,
updated_at: Mon, 16 May 2022 14:25:03 JST +09:00,
user_id: 1>]
[2] pry(main)> posts[0].content
=> "hogehoge\r\n"
ユーザー詳細ページに投稿を表示しよう(2)
インスタンスメソッドでWhere
を使う
def posts
return User.where(user_id: self.id)
end
self
はUserモデルを指している。
userモデル
のデータベースからuser_id
がメソッドを使うインスタンスのid
を基に投稿を探す。
[1] pry(main)> user = User.find_by(id: 1)
User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]]
=> #<User:0x000055d5c845b368
id: 1,
name: "にんじゃわんこ",
email: "wanko@prog-8.com",
created_at: Tue, 18 Apr 2017 17:06:52 JST +09:00,
updated_at: Tue, 18 Apr 2017 17:06:52 JST +09:00,
image_name: "default_user.jpg",
password: "ninjawanko">
[2] pry(main)> user.posts
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."user_id" = ? [["user_id", 1]]
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."user_id" = ? [["user_id", 1]]
=> #<User::ActiveRecord_Relation:0x2aeae4201d64>
whereメソッドを用いて、user_idが「self.id」の投稿を取得してください
def posts
return User.where(user_id: self.id)
end
def posts
return Post.where(user_id: self.id)
end
取り出すモデルが違っていた
。
userモデル
のデータベースからuser_id
がメソッドを使うインスタンスのid
を基に投稿(Postモデルモデルのデータ)を探す。
思ったこと
取り出すモデルのデータを意識することが大事だ。
self
にインスタンスを代入させるのかな。
これで成功。
ユーザー詳細ページに投稿を表示しよう(3)
一覧を表示させるにはeach文
を使う。
<% @user.posts.each do |post| %>
.
.
.
<% end %>
これで一つ一つ取り出せる
<% @user.posts.each do |post| %>
<!-- 指定されたコードを貼り付けてください -->
<div class="posts-index-item">
<div class="post-left">
<img src="<%= "/user_images/#{post.user.image_name}" %>">
</div>
<div class="post-right">
<div class="post-user-name">
<%= link_to(post.user.name, "/users/#{post.user.id}") %>
</div>
<%= link_to(post.content, "/posts/#{post.id}") %>
</div>
</div>
<!-- 以下の<% %>を使ってeach文のendを追加してください -->
<% end %>
each文
の中は特段変わらないhtml
の文
思ったこと
今はなんだかわからないがなんか腑に落ちない感じがする。