LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-09-26

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)に以下のファイルを作りました。

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ボタンを押してみましょう。
スクリーンショット 2018-09-26 23.37.26.png

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

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

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

ルーティングの設定をみてみましょう
スクリーンショット 2018-09-16 23.04.57.png

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

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

rails console
スクリーンショット 2018-09-26 23.55.29.png
こんな感じになると思う。
ここでは自分が作ったアプリについていろいろできる。
上で書いてたfindをやってみよう。

スクリーンショット 2018-09-26 23.56.59.png

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

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

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アクション内のものとは別物)

showアクション
    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

0
0
2

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