初心者がRailsガイドを1から100まで読んでみる　Railsをはじめよう編その７　データの表示

####5.7.記事を表示する

記事を登録する画面と、それをデータベースに保存する仕組みを作りました。
お次は僕のポエムをみたい読者のために記事を表示する画面を作りましょう！

前節にて以下の記述でshowアクションにとべることを学びました。

```article_controller.rb

redirect_to @article

```

モデル名と同じ名前で@articleという変数を作ってあげると、その変数は自動的にモデルと関連づいて、その変数に対してリダイレクトすると、showアクションにリダイレクトされます。
(Railsちゃん察し良すぎ）

モデルを作るときは
`resources:モデル名`
とroutes.rbに書いとくと何かと便利そう。

でも今のコントローラにはshowアクションを実装していません。

書いてみました。↓

```article_controller.rb
class ArticlesController < ApplicationController

	def show
		@article = Article.find(params[:id])
	end

	def new
	end
	
	def create
		@article = Article.new(article_params)

		@article.save
		redirect_to @article
	end

	private
		def article_params
    		params.require(:article).permit(:title, :text)
  		end	
end
```

`@article = Article.find(params[:id])`
showアクションの中にはこう書いてあります。
Article.find()と書けば()内の条件でarticlesテーブルを検索してくれるんだって。
今回はその検索条件がparams[:id]だけど…
どういうことだろう。
paramsというとリダイレクトされた時に渡された内容だろう。
:idなんてパラメータが渡ってくるのか？
その:idで検索すれば、createアクション内でついさっき保存した記事が取得できるのか？

疑問は解決してないけど、いったん次に進むか…

showアクションを定義しました。
次に作るのはそのアクションに対応したビューです。

ということでビューの場所（app/views/articles）に以下のファイルを作りました。

```erb:show.html.erb
<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>
 
<p>
  <strong>Text:</strong>
  <%= @article.text %>
</p>
```

@articleのタイトルとテキストを表示していますね。
@articleはshowアクション内の`@article = Article.find(params[:id])`のやつとおんなじです。
ガイドの注釈にもありましたが、アクション内の@モデル名という変数は（その他の@で始まるインスタンス変数は）、その中身を絶えずビューにコピーしているみたいです。Railsちゃん健気！
showアクションの@articleはarticlesテーブルの中身をparams[:id]で検索した結果です。

これでSave Articleボタンを押してみましょう。
<img width="305" alt="スクリーンショット 2018-09-26 23.37.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/129c94d2-a4be-e63b-8121-ed9d87343b65.png">

おお！
記事が表示されました！

#####Article.find(params[:id])の疑問

showビューのURLをご覧ください。
localhost:3000/articles/2
となってますね。
articles/の下はnewだったりしてましたけど、2ってなんやねん2って。show.html.erbにとばしたはずやで。

ルーティングの設定をみてみましょう
<img width="491" alt="スクリーンショット 2018-09-16 23.04.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/7c623b89-e017-e43c-d4ba-da3acaab9f17.png">

showアクションのとこのURI Patternに確かに/articles/:idになってはる！
つまりshowアクションで表示されるビューのURLはarticle/showじゃなくてarticle/1とかarticle/100とかってことらしい。
で、この:idってやつがarticlesテーブルに保存されているレコードの番号らしい。

articlesテーブルの中身を見るために、blogのディレクトリに入って以下のコマンドを打ってみよう

`rails console`
<img width="404" alt="スクリーンショット 2018-09-26 23.55.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/30e5f736-765e-0be6-7270-cf112a7e3611.png">
こんな感じになると思う。
ここでは自分が作ったアプリについていろいろできる。
上で書いてたfindをやってみよう。

<img width="563" alt="スクリーンショット 2018-09-26 23.56.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/283826/104ed443-3d82-1dbb-3b72-e850317f9d88.png">

URLに書いてあった:idが2だったのでArticle.find(2)で検索してみた。
すると、id:2のデータが引っ張ってこれた。そしてこれはarticles/newのページでSave Articleしたデータだ。（1はその前に試し打ちしたデータでした）

つまり…
まずcreateアクション内で@article.saveをする。
その時にid=2としてテーブルに保存される。

```rb:createアクション
	def create
		@article = Article.new(article_params)

		@article.save
		redirect_to @article
	end
```

次に、これまたcreateアクション内で@articleにリダイレクトする。
この@articleは直前にsaveしたもので、id=2である。

リダイレクト先のshowアクションでは受け取ったパラメータのid(=2)をもとにarticlesテーブルを検索している。
その検索結果を@articleに渡しているので、showビューで表示される。（この@articleはcreateアクション内のものとは別物）

```rb:showアクション
	def show
		@article = Article.find(params[:id])
	end
```

ルーティングの設定上、URI Patternはshowしたいデータのidとなっているため
今回はarticles/2というURLになっている。
（ちなみに保存してあればarticles/100でも200でもURLを直接打てばデータがみれる。これがセキュリティ上いいのかはさておき）

ということみたいだ。
さらっと流しているけど結構複雑だぞ。

Railsちゃん気が利きすぎて裏で何やってるのかわかんないことあるよね。


その８
https://qiita.com/Natsuki_on_Rails/items/13a43e1ee8d9a45894c2