20200914_アウトプット

アプトプット画像

学習した内容(大まか)

railsのテストコードについて(コントローラー)5時間30分

 

理解したこと(項目) 

  • response.body(概念)ブラウザのHTML情報を抜き出す
  • bundle exec rspec spec/requests/tweets_spec.rb(ターミナル)
  • expect(response.body).to include @tweet.text(VSコード)
  • expect(response.body).to include @tweet.image(VSコード)
  • expect(response.body).to include "投稿を検索する"(VSコード)
  • get tweet_path(@tweet)
  • expect(response.status).to eq 200
  • expect(response.body).to include @tweet.text
  • expect(response.body).to include @tweet.imag
  • expect(response.body).to include "<コメント一覧>"

 

復習 その1:部分テンプレート

  • 部分テンプレート(概念):ビューファイルにて繰り返し使用
  • _sample.html.erb(VSコード):切り出したファイル名
  • <%= render partial: "sample", locals: { post: "hello!" } %>(VSコード)
  • ディレクトリから呼び出す場合はpartial: "samples/sample"に変更
  • renderメソッド(概念):部分テンプレートを呼び出すメソッド
  • partial(パーシャル)オプション(概念):呼び出すテンプレートを指定
  • localsオプション(概念):このオプションで指定した変数は、部分テンプレートで使用可

復習 その2:ルーティング

  • tweet GET    /tweets/:id(.:format) (ターミナル rails routesの一部)

  • get tweet_path(@tweet

  • resources :tweets do
    resources :comments, only: :create
    collection do
    get 'search'
    end
  • tweet_comments POST /tweets/:tweet_id/comments(.:format) comments#create (ターミナル rails routesの一部)

 

自分の言葉で説明すると・・

 

response.body

 

response.bodyとは、HTMLのbody情報を表すテストコードです。

 

きちんとテキストがブラウザに表示されているか、画像が表示されているか、など、HTMLのbody情報に記述内容が存在しているかをテストすることが出来ます。

 

VSコード上では、「include(@tweet.text)」(※@tweetにあたる部分はFactoryBotで作成したインスタンス)と、記述します。

 

この際のポイントとしては「@tweet.text」にあたる部分について、そのまま”文字面”で表示されるわけではない、ということです。

 

もう少し具体的にいうと、今私が作っているものでは、「@tweet.text」にあたる部分は、ビューファイルの中にある「<p><%= tweet.text %></p>」です。

 

つまり、「response.body」を「binding.pry」で調べたときに、「<p><%= tweet.text %></p>」がきちんと表示されていれば「OK」ということです。

 

 

さて、私は「response.body」について勉強しているとき、ビューファイルに関する「部分テンプレート」と、「ルーティング」のおさらいしました。ここからはその説明です。

 

部分テンプレート

 

まず、「部分テンプレート」ですが、何度も同じ記載をするビュー部分について、切り取ってその専用ファイルを作成することで、別ファイルで再利用することが出来ます。

 

その時のルールとして、切り取って作成したファイルの初めには「_(アンダーバー)」をつけます。

 

そして、そのファイルを呼び出す側は「render(メソッド)」と「partial(

renderメソッドのときに使うオプション)」と「locals(同じくオプション)」を使用します。

 

それぞれ下記のような役割を果たします。

  1. renderの役割は、”呼び出します!(メソッド)”
  2. partialの役割は、先ほどの「_(アンダーバー)」のファイル名にあたる部分を書いて、具体的にどのファイルを呼び出すのか指定(そのとき別のフォルダの場合には、「フォルダ/ファイル名」とフォルダ名から指定が必要!)
  3. localsの役割は、呼び出した先で指定した変数が使えるようにする

 

 

ルーティング

 

続いて、ルーティングのおさらいをしました。

 

対象のディレクトリに移動の上、ターミナルにて「rails routes」とコマンドを実行すると、ルーティングが表示されます。

 

見るポイントとしては、右側の「Controller#Action」がシンプルな部分を探します。

gemでdeviseなどをインストールしていると、それらのルーテングも全て一気に表示されてしまうためです。

 

表示された内容の役割としては、

 

(1)「Prefix(接頭語)」

 

Prefix」にあたる部分の後ろに「_path」をつけると、「そのページへ遷移するルーティング」と表現することが出来ます。

 

何故、「Prefix_path」で統一するのでしょうか。

 

理由は「可読性をあげるため」です。

ホームページによっては、URLが長くなります。

統一の表記をすることで、「このアクションの時はここのページへいくのね」と誰が見ても分かりやすくなります。

 

なお、基本的には「Prefix(接頭語)_path」に統一します。

「/(ホームへ戻る)」と「root_path(ホームへ戻る)」は同じ意味ですが、ファイルごとにバラバラに表記したりはしません。

 

(2)「URI Pattern」

 

例えば、「/tweets/:id(.:format)」があったとして説明します。

 

上記の「tweets」は、「config/routes.rb」で指定しているルーティングのことを指しています。

 

「:id」がついているものは、紐付け処理が必要なものになります。

 

紐付け処理が必要なものには、基本的には、”()かっこ”が必要です。

 ※「resources」を使うときは、不要

 

なので(response.bodyの話に戻りますが)対象のルーティングを指定するときに「get tweet_path(@tweet)」と書きました。(後半の部分は紐付けのことを表現しています)

 

もう一つプラスの復習で、ルーティングの入れ子構造についてです。

 

例えば、”写真を投稿するサイト”があったとして、”写真に対し、コメントをできる”とします。

その場合、コメントは”対象の写真に対して”紐付きます。

 

なので、ルーティング上でも、「写真を投稿する」ルーティングの中に、「コメントが作られる」ルーティングを設定します。(入れ子構造にする)

 

わからないこと(積み残し)

  • response.bodyの結果の見方→解決!

 

以上です!

誤っていた時は、ぜひコメントで教えてください!