5.7.記事を表示する
記事を登録する画面と、それをデータベースに保存する仕組みを作りました。
お次は僕のポエムをみたい読者のために記事を表示する画面を作りましょう!
前節にて以下の記述でshowアクションにとべることを学びました。
redirect_to @article
モデル名と同じ名前で@articleという変数を作ってあげると、その変数は自動的にモデルと関連づいて、その変数に対してリダイレクトすると、showアクションにリダイレクトされます。
(Railsちゃん察し良すぎ)
モデルを作るときは
resources:モデル名
とroutes.rbに書いとくと何かと便利そう。
でも今のコントローラにはshowアクションを実装していません。
書いてみました。↓
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)に以下のファイルを作りました。
<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]で検索した結果です。
おお!
記事が表示されました!
Article.find(params[:id])の疑問
showビューのURLをご覧ください。
localhost:3000/articles/2
となってますね。
articles/の下はnewだったりしてましたけど、2ってなんやねん2って。show.html.erbにとばしたはずやで。
showアクションのとこのURI Patternに確かに/articles/:idになってはる!
つまりshowアクションで表示されるビューのURLはarticle/showじゃなくてarticle/1とかarticle/100とかってことらしい。
で、この:idってやつがarticlesテーブルに保存されているレコードの番号らしい。
articlesテーブルの中身を見るために、blogのディレクトリに入って以下のコマンドを打ってみよう
rails console
こんな感じになると思う。
ここでは自分が作ったアプリについていろいろできる。
上で書いてたfindをやってみよう。
URLに書いてあった:idが2だったのでArticle.find(2)で検索してみた。
すると、id:2のデータが引っ張ってこれた。そしてこれはarticles/newのページでSave Articleしたデータだ。(1はその前に試し打ちしたデータでした)
つまり…
まずcreateアクション内で@article.saveをする。
その時にid=2としてテーブルに保存される。
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アクション内のものとは別物)
def show
@article = Article.find(params[:id])
end
ルーティングの設定上、URI Patternはshowしたいデータのidとなっているため
今回はarticles/2というURLになっている。
(ちなみに保存してあればarticles/100でも200でもURLを直接打てばデータがみれる。これがセキュリティ上いいのかはさておき)
ということみたいだ。
さらっと流しているけど結構複雑だぞ。
Railsちゃん気が利きすぎて裏で何やってるのかわかんないことあるよね。
その8
https://qiita.com/Natsuki_on_Rails/items/13a43e1ee8d9a45894c2