BETA

【Sinatra】でレコードを投稿したユーザ名の取得

投稿日:2019-11-22
最終更新:2019-11-22

【Sinatra】アクティブレコードを使って1対多の関係を表してみる の続きです!

前回は投稿したユーザIDを取得しましたが、今回は投稿したユーザ名を表示させてみます!

どうやってユーザ名を取得するか考える


*gonという便利gemを使ってます。

投稿したレコードにはユーザ名を紐てけてませんが、user_id だけ紐づけられてます。
これを利用しましょう。
Postテーブルのレコードは配列なので、投稿ごとにユーザ名を表示させるにはどうやるのか?

DBの内容

Userテーブル

class CreateUsers < ActiveRecord::Migration[6.0]  
  def change  

    create_table :users do |t|   
      t.string :name  
      t.string :email  
      t.string :password_digest  
    end  
  end  
end  

Postテーブル

class CreatePosts < ActiveRecord::Migration[6.0]  
  def change  
    create_table :posts do |t|  
      t.string :content  
      t.references :user, foreign_key: true  

      t.timestamps  
    end  
  end  
end  

としています。

実際にやったこと

Postテーブルのレコードは配列に格納されているので、一つ一つのレコードのユーザ名を取得させるためにコントローラを使うのは処理がややこしくなりそう。。
恐らくView内で完結できるぞ!ということでViewファイルをいじります。

post/all.erb

<% @posts.each do |post| %>  
    <p>  
    <%= post.id %>  
    <%= post.content %>  
    <%= post.user_id %>  
    <% if post.user_id || nil %>  
      <% post_user = User.find(post.user_id) %>  
      <%= post_user.name %>  
    <% end %>  
    <td>  
    <form method="post" action="/post/delete/<%= post.id %>">   
        <button class = "btn btn-outline-secondary" type="submit">投稿の削除</button>  
    </form>  
</td>  
<% end %>  

ミソはここです。

    <% if post.user_id || nil %>  
      <% post_user = User.find(post.user_id) %>  
      <%= post_user.name %>  
    <% end %>  

PostテーブルとUserテーブルを紐づけるまえに作成したレコードはuser_id: null となっているので、user_id を使用することができなくてエラーになります。

post_user にはpost.user_id で取得したユーザID(数字)でUserテーブルから取得したユーザの情報を入れています。
そして<%= post_user.name %> で取得したユーザからuser.nameを取り出しています。

レコードを投稿したユーザ名を取り出せました!

まとめ

やりたかったことが形になってきました!
RailsならすぐできることがSinatraはひとひねりしないといけないんで、楽しいです。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

初学者の成長が垣間見れます

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう