Skip to content

第3回 2014 9 27

YataFumika edited this page Feb 28, 2015 · 45 revisions

----- まとめを作成しました。誤りがあればissueでご指摘頂けるとうれしいです -----

<おさらい>

「2.4 最後に」 までのところでできていない部分をフォロー

<本編>

☆読んだだけ ★読んでタイプなどを行った

[◆◆◆ 方針の変更のお知らせ ◆◆◆]
以降、herokuの部分については演習を行わないことにしました。
理由はうまく動作しないことがあり、演習に時間がかかるためです。
その分Ruby on Railsの演習に時間を使おうと思います。

★第3章ほぼ静的なページの作成

  • sample_appというプロジェクトを作成
    $ cd rails_projects
    $ rails new sample_app --skip-test-unit
    $ cd sample_app
    --skip-test-unitというオプションは、Test::Unitフレームワークと関連している
    testディレクトリを作成しないようにするオプション
    テストフレームワークであるRSpecを使ってテストを書くため

  • Gemfileの編集 リスト 3.1 参照 ただし、以下のメモを確認

[メモ] 追加の部分を記述する
    既に記述されている部分はgroupの囲みの追加にとどめる
    バージョンはあえて書かない(そうすると最適なバージョンが選択されるため)
  • Gemfileに新しく追加したgemを実際にインストール
    $ bundle install --without production
    $ bundle update
    $ bundle install
    --without productionオプションを追加することで、本番環境のgemのみを
    インストールしないようにすることができる
    一度実行するとコマンドに保存され、今後は単にbundle installを実行するだけで、
    自動的に本番環境用gemをスキップできるようになる
[メモ] 環境について
    :development 開発環境, :test テスト環境, :production 本番環境
  • 秘密トークン(Railsでセッション変数の暗号化に使用するためもの)を動的に生成する
    config/initializers/secret_token.rb
    リスト 3.2 参照

  • Test::Unitの代わりにRSpecを使うように、Railsの設定を変更
    $ rails generate rspec:install

  • Gitリポジトリを初期化
    $ git init
    $ git add .
    $ git commit -m "Initial commit"

  • READMEファイルの書き換え
    リスト3.3 参照

  • 拡張子を .md に変更し、Markdownファイルとして認識できるようにし、コミット
    $ git mv README.rdoc README.md
    $ git commit -am "Improve the README"
    “すべてを変更” (-a) オプションとコミットメッセージを追加するオプション (-m)

  • GitHub上にリポジトリを作成し、プッシュ
    $ git remote add origin https://github.com/<ユーザー名>/sample_app.git
    $ git push -u origin master

★3.1静的ページ

  • Gitを使ってトピックブランチを作成
    新しい機能やページを作成するときは、masterブランチではなくトピックブランチで作業するのがよい
    $ git checkout -b static-pages

  • コントローラの作成
    $ rails generate controller StaticPages home help --no-test-framework
    generateスクリプトにコントローラ名を入力するとコントローラが作成される
    generateスクリプトは、アクションを引数に取ることができる
    HomeページとHelpページのアクションを作成する
    RSpecのテストを使わないため、--no-test-frameworkというオプションを付け加え、
    RSpecのテストを自動的に生成しないようにする
    コントローラ名StaticPagesを指定すると、static_pages_controller.rbが作成される
    config/routes.rbファイル(URLとWebページを対応付けるもの)が自動的に更新される

  • config/routes.rb

SampleApp::Application.routes.draw do
  get "static_pages/home"
  get "static_pages/help"
  ...
end

get "static_pages/home" は/static_pages/homeというURLに対するリクエストを、
StaticPagesコントローラのhomeアクションと結びつけている

  • StaticPagesコントローラ
    app/controllers/static_pages_controller.rb
    リスト3.6 参照
    /static_pages/homeというURLにアクセスすると、
    RailsはStaticPagesコントローラを参照し、
    homeアクションに記述されているコードを実行する
    その後、そのアクションに対応するビューを出力する
    homeアクションは、home.html.erbというビューに対応している

  • Homeページを出力する、生成されたビュー
    app/views/static_pages/home.html.erb
    リスト3.7 参照

  • Helpページを出力する、生成されたビュー
    app/views/static_pages/help.html.erb
    リスト3.8 参照
    重要なのは「Railsのビューは静的なHTMLで構成されている」という点

  • StaticPagesコントローラファイルをGitリポジトリに追加
    $ git add .
    $ git commit -m "Add a StaticPages controller"

☆3.2最初のテスト

★3.2.1テスト駆動開発

  • テスト駆動開発でいくつかのコンテンツをHomeページに追加する
    静的なページに対する結合テスト (request spec) を生成する
    $ rails generate integration_test static_pages
    spec/requestsディレクトリにstatic_pages_spec.rbが生成される

  • Homeページの内容をテストするコード
    spec/requests/static_pages_spec.rb

require 'spec_helper'  
describe "Static pages" do  
  describe "Home page" do  
    it "should have the content 'Sample App'" do  
      visit '/static_pages/home'  
      expect(page).to have_content('Sample App')  
    end  
  end  
end  

describeというブロックがあり、そのブロック内には it "…" doで始まるテスト例がある
describe "Home page" do 「Homeページに対するテストである」と記述されている
RSpecはダブルクォート (") で囲まれた文字列を無視するのでコメントを書く
次の行は「/static_pages/homeのHomeページにアクセスしたとき、 “Sample App”という語が含まれていなければならない」と記述されている
visit '/static_pages/home' Capybaraのvisit機能を使って、
ブラウザでの/static_pages/homeURLへのアクセスをシミュレーション
expect(page).to have_content('Sample App') Capybaraが提供するpage変数を使って、
アクセスした結果のページに正しいコンテンツが表示されているかどうかをテスト

  • Capybara DSLをRSpecヘルパーファイルに追加する。
    spec/spec_helper.rb
RSpec.configure do |config|
  ...
  config.include Capybara::DSL
end
  • テストを実行
    $ bundle exec rspec spec/requests/static_pages_spec.rb bundle execをこのコマンドの前に置くことで、Gemfile内で定義された環境で
    RSpecが実行されるように、明示的に指示する
    「テストが失敗した」という結果が返ってくる
実行して
 uninitialized constant Capybara (NameError)
 が発生する場合

1. spec_helper.rbの「config.include Capybara::DSL」の直前に以下のロジックを書くと解決します。

ENV["RAILS_ENV"] ||= 'test'
 require File.expand_path("../../config/environment", __FILE__)
 require 'rspec/rails'
  1. spec/rails_helper.rbに指定のコードを追加します
RSpec.configure do |config|
  # 以下のコマンドを追加
  config.include Capybara::DSL
end
  • テストにパスするために、自動生成されたHomeページのHTMLを書き換える
    app/views/static_pages/home.html.erb
    リスト3.11参照

  • テストを実行
    $ bundle exec rspec spec/requests/static_pages_spec.rb
    トップレベルの見出しがSample Appに変更されたため、テストにパスする

  • Helpページの内容をテストするコードを追加する。
    spec/requests/static_pages_spec.rb
    リスト3.12参照

  • テストを実行
    $ bundle exec rspec spec/requests/static_pages_spec.rb
    テストのうち、1つは失敗

  • テストにパスする、Helpページ用のコードを記述
    app/views/static_pages/help.html.erb
    リスト3.13 参照

  • テストを実行
    $ bundle exec rspec spec/requests/static_pages_spec.rb
    テストにパス

[メモ] テストにパスしない場合
spec/requests/static_pages_spec.rbのrequire 'spec_helper'の次に以下のように記述してみる

RSpec.configure do |config| 
#
## Mock Framework #
#..... config.order = "random"
config.include Capybara::DSL
config.include Rails.application.routes.url_helpers 

★3.2.2ページの追加

もう少し複雑なタスクを実行するページを新規追加する

  • Aboutページのテストを追加する
    spec/requests/static_pages_spec.rb
    リスト3.14 参照

  • RSpecのテストを実行します。
    $ bundle exec rspec spec/requests/static_pages_spec.rb

  • 以下のような警告が表示される
    No route matches [GET] "/static_pages/about"
    /static_pages/aboutというルートをroutesファイルに追加する必要があるということを示している

  • about用のルートを追加
    config/routes.rb
    リスト3.15 参照

  • RSpecのテストを実行します。
    $ bundle exec rspec spec/requests/static_pages_spec.rb

  • エラーメッセージが発生します。
    The action 'about' could not be found for StaticPagesController

  • StaticPagesコントローラの中にaboutアクションを追加することで解決する リスト3.16 参照

  • 再び以下を実行します。
    $ bundle exec rspec spec/requests/static_pages_spec.rb

  • 以下のような警告が表示される
    Missing template static_pages/about
    "テンプレート" が見当たらないというエラーメッセージ

  • aboutビューを追加することで解決する
    app/views/static_pages/about.html.erb
    リスト3.17 参照

  • RSpecのテストを実行
    $ bundle exec rspec spec/requests/static_pages_spec.rb
    テストにパス

  • ブラウザを起動して、/static_pages/about にアクセスしてみる

第4回は【3.3少しだけ動的なページ】からはじめます(^^)/

<おまけ/コラム>

[コラム 3.2] 元に戻す方法
自動生成されたコードを元に戻す方法  
$ rails generate controller FooBars baz quux
$ rails destroy  controller FooBars baz quux  

$ rails generate model Foo bar:string baz:integer
$ rails destroy model Foo   

$ rake db:migrate  
$ rake db:rollback              1つ前の状態に戻す
$ rake db:migrate VERSION=0     最初の状態に戻す       
[コラム 3.3] GETやその他のHTTPメソッドについて
GET :最も頻繁に使用されるHTTP操作で、主にWeb上のデータを読み取る際に使われる
   Webサイトを開くたびにGETリクエストを送信している
POST:Railsアプリケーションでは、リクエストは何かを作成するときによく使われる
   (なお本来のHTTPでは、POSTを更新に使ってもよいとしてる)
   たとえば、ユーザー登録フォームで新しいユーザーを作成するときなど
PATCHと DELETE:それぞれサーバー上の何かを更新したり削除したりするときに使われる
   これら2つの操作は、GETやPOSTほどは使用されてない。
   これは、ブラウザがPATCHとDELETEをネイティブでは送信しないから。
   しかし、Ruby on Railsなどの多くのWebフレームワークは、
   ブラウザがこれらの操作のリクエストを送信しているかのように見せかける技術 (偽装) を駆使して、
   PATCHとDELETEという操作を実現している。
   なお、以前のバージョンのRailsではPATCHではなくPUTが使用されていた。
   PUTはRails 4.0でも依然サポートされてはいるが、PATCHの方が意図したHTTPの使用法により適しているので、
   新しいアプリケーションではPATCHが推奨されている
You can’t perform that action at this time.