0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

rails5 progate 整理メモ 投稿の一覧を表示する

Posted at

投稿一覧にもユーザー情報を表示しよう

<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を使う

user.rb
  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」の投稿を取得してください

user.rb
  def posts
    return User.where(user_id: self.id)
  end
user.rb
  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の文

思ったこと

今はなんだかわからないがなんか腑に落ちない感じがする。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?