(Ruby on Rails6) データーベースのidを取得したデータベースの表示

#マシンスペック
・バージョン 10.15.3
・Ruby ruby 2.6.3p62
・Rails 6.0.3.2

#まえがき
<a href="https://qiita.com/Tateishi0819/items/8bd47be53f73d23ca274" target="blank">前記事</a>では、データーベースをビューに表示する方法を記録しました。
しかし、せっかくRuby on Railsで作品を作りたいなら<strong>id取得</strong>をやりたい!
ここでは、idによるデーターベース表示を忘却録として記録します。
何かにお役に立てたら嬉しいです。

#データーベースのidを取得したデータベースの表示
これからの作業は、すでにデーターベースを作成する必要がありますのでご注意ください。
詳しくは→<a href="https://qiita.com/Tateishi0819/items/8bd47be53f73d23ca274" target="blank">前記事</a>へ

##idのroutesを設定する

routesのイメージ
↓の感じに "投稿・登録" されたら "マイページ・詳細ページ" とかを id の数に合わせて作りたい
1~4がidになります。

```rb:config/routes
Rails.application.routes.draw do
  get 'コントローラー名/index'
  get 'コントローラー名/1' => 'コントローラー名#アクション名'
  get 'コントローラー名/2' => 'コントローラー名#アクション名'
  get 'コントローラー名/3' => 'コントローラー名#アクション名'
  get 'コントローラー名/4' => 'コントローラー名#アクション名'
end
```
このままでは routes がえらい多い記述になってしまうので↓のように記述します。

```rb:config/routes
Rails.application.routes.draw do
  get 'コントローラー名/:id' => 'コントローラー名#アクション名'
end
```

↓例

```rb:config/routes
Rails.application.routes.draw do
  get 'posts/:id' => 'posts#index'
end
```

先ほどの、1~4の部分を <strong>:id</strong> で置き換えています。

###routesでの注意!
routes上で↓の様になると、エラーになってしまいます。

(エラー)

```rb:config/routes
Rails.application.routes.draw do
  get 'コントローラー名/:id' => 'コントローラー名#アクション名' ←先に記述
  get "/" => "forms#index"
end
```

<strong>get 'posts/:id' = 'posts#index'</strong> の <strong>:id</strong> ルートを通常のルートより先に記述してしまうとエラーになってしまいます。
なので、↓の様に記述すること。

(サクセス)

```rb:config/routes
Rails.application.routes.draw do
  get "/" => "forms#index"
  get 'コントローラー名/:id' => 'コントローラー名#アクション名' ←後に記述
end
```

↓例

```rb:config/routes
Rails.application.routes.draw do
  get "/" => "forms#index"
  get 'posts/:id' => 'posts#index' ←後に記述
end
```
##controllerへの記述

controllerは、この地点では初期設定で問題ありません。

```rb:app/controllers/任意_controller
class PostsController < ApplicationController
  def アクション名
  end
end
```

例↓

```rb:app/controllers/任意_controller
class PostsController < ApplicationController
  def index
  end
end
```

##URLからidを取得する

idを取得するには、コントローラーのアクションに <strong>params[:id]</strong> を使用します。
<strong>params</strong>は、値を受け取るメソッドになります。

```rb:app/controllers/任意_controller
class PostsController < ApplicationController
  def アクション名
    @id = params[:id]
  end
end
```
controllerでは @ を付けなければいけないので @id にすることを忘れないでください。

例↓

```rb:app/controllers/任意_controller
class PostsController < ApplicationController
  def index
    @id = params[:id]
  end
end
```

##Viewで表示する

```erb:app/views/任意/index.html.erb
<h1>Title</h1>
<p>smple text</p>
<%= "idが「#{@id}」の画面です" %>
```

ここで一度、ブラウザで確認しましょう

```terminal:コマンド
rails s
```
(URL) http://localhost:3000/posts/1

![rails-post_test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/82952a64-8848-380f-02ed-027bcbe5c675.png)

表示されました。
画像と、Qiitaでは文字の内容が異なりますが、気にしないでください。

```erb:app/views/任意/index.html.erb
<%= "idが「#{@id}」の画面です" %>
```
の <strong>#{@id}</strong> に idが読み込まれ、
また <strong><%= ~~ %></strong> なので、ビューに表示されてます。


ここまでは、URLとidについて設定しました。
ここからは、idに対応したデータを取得しましょう。

#idに対応したデータを取得

##controllerへの設定
idを<strong>等しく</strong>出力するために

<strong>find_by と params[:id]</strong> を使用します。

```rb:app/controllers/任意_controller
class PostsController < ApplicationController
  def アクション名
    @テーブル名 = データーベース名.find_by(id: params[:id])
  end
end
```

↓例

```rb:app/controllers/任意_controller
class PostsController < ApplicationController
  def index
    @post = Post.find_by(id: params[:id])
  end
end
```
###用語説明

<strong>find_by</strong> は、idのカラム値が "params[:id]" に等しい値を取得しています。
また
<strong>params[:id]</strong>は、ブラウザからRailsアプリケーションに送られてきたデータを保持するオブジェクトを保持できるようになります。

##viewsへの設定

最後にviewsへ設定を行います。
ここでは 投稿内容 と 投稿時間 を表示させましょう。

```erb:app/views/任意/index.html.erb
<h1>Title</h1>
<p>sample text</p>
    <%= @post.content %>
    <%= @post.created_at %>
```

以下
を入力し、ブラウザで確認してください。

```terminal:コマンド
rails s
```

![rails-post_test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262991/b1fb2b71-a6c9-438d-b34f-b66e644437fc.png)

rails console コマンドで test1 を入力したのですが、しっかり反映されています。

###要素の説明

```erb:app/views/任意/index.html.erb
<%= @post.content %>
→content(投稿テキスト)の取得

<%= @post.created_at %>
→投稿時間を取得
```

###おまけ/リンク
もしも、この投稿にリンクさせたい場合は、以下をviewsに記述してください。

```erb:app/views/任意/index.html.erb
<%= link_to(投稿.content, "/ページ名/#{post.id}") %>
```

例↓

```erb:app/views/任意/index.html.erb
<%= link_to(post.content, "/posts/#{post.id}") %>
```

以上のコードはGithubで公開しています。
気になるかたは、ダウンロードしてください。
→　<a href="https://github.com/ayu0819/test_rails6-database-id" target="blank">Github</a>

#あとがき
以上が、データーベースのidを取得したデータベースの表示でした。
idを取得して、URLやデーターベースの内容を出力できるのは非常にありがたいと思います。
工夫をしたら、多くの場面で活用できると思います。
ここまで、お読みいただきありがとうございました。

#参考リンク
書籍: <a href="https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC6%E7%89%88-Informatics-IDEA-%E9%AB%98%E6%A9%8B/dp/4797399848/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby+%E7%AC%AC6%E7%89%88&qid=1600088731&s=books&sr=1-1" target="blank">たのしいRuby 第6版</a>

#私のリンク
また、Twitter・ポートフォリオのリンクがありますので、気になった方は
ぜひ繋がってください。プログラミング学習を共有できるフレンドが出来るととても嬉しいです。

<a href="https://twitter.com/0819_tateishi" target="blank">Twitter</a>
<a href="https://ayu-portfolio.herokuapp.com/" target="blank">Portfolio</a>
<a href="https://github.com/ayu0819" target="blank">Github</a>