朝練

試験に失敗するなぁ、と思ってたら chapter 4 を merge していなかったことが判明。で、filling-in-layout な branch はステることにします。
一応、5.1 までの部分を盛り込んで試験 green を確認しとります。

5.2

とりあえず以下。

$ rails generate integration_test layout_links
      invoke  rspec
      create    spec/requests/layout_links_spec.rb
$

ええと、以下を盛り込んで試験実行してみましたが、当たり前に red です。

require 'spec_helper'

describe "LayoutLinks" do

  it "should have a Home page at '/'" do
    get '/'
    response.should have_selector('title', :content => "Home")
  end

  it "should have a Contact page at '/contact'" do
    get '/contact'
    response.should have_selector('title', :content => "Contact")
  end

  it "should have an About page at '/about'" do
    get '/about'
    response.should have_selector('title', :content => "About")
  end

  it "should have a Help page at '/help'" do
    get '/help'
    response.should have_selector('title', :content => "Help")
  end
end

とりあえず app/controllers/pages_controller.rb に Help は追加済みですね。あるいは app/views/pages/help.html.erb も大丈夫ですね。
あとは config/routes.rb を云々する必要があるのかどうか。以下を追加して試験 green を確認してます。

  match '/contact', :to => 'pages#contact'
  match '/about',   :to => 'pages#about'
  match '/help',    :to => 'pages#help'

  root :to => 'pages#home'

ちょい本文読も。今、5.2.2 までな部分ですね。

5.2.3

続けます。というか上記な記述で

  • contact_path
  • about_path
  • help_path
  • root_path

なるナニでパスを参照できるのか。これは凄い。昔は無かったソレですね。ええと、_header.html.erb を以下に修正して

<header>
  <% logo = image_tag("logo.png", :alt => "Sample App", :class => "round") %>
  <%= link_to logo, root_path %>
  <nav class="round">
    <ul>
      <li><%= link_to "Home", root_path %></li>
      <li><%= link_to "Help", help_path %></li>
      <li><%= link_to "Sign in", '#' %></li>
    </ul>
  </nav>
</header>

あるいは _footer.html.erb を以下にしてます。

<footer>
  <nav class="round">
    <ul>
      <li><%= link_to "About", about_path %></li>
      <li><%= link_to "Contact", contact_path %></li>
      <li><a href="http://news.railstutorial.org/">News</a></li>
      <li><a href="http://www.railstutorial.org/">Rails Tutorial</a></li>
    </ul>
  </nav>
</footer>

これはこれは。

5.3 User signup: A first step

ここがなんとかなったら別な作業に着手な方向なのだけどどうなることやら。とりあえず User signup ということで user なナニを作成する模様。

$ rails generate controller Users new
      create  app/controllers/users_controller.rb
       route  get "users/new"
      invoke  erb
      create    app/views/users
      create    app/views/users/new.html.erb
      invoke  rspec
      create    spec/controllers/users_controller_spec.rb
      create    spec/views/users
      create    spec/views/users/new.html.erb_spec.rb
      invoke  helper
      create    app/helpers/users_helper.rb
      invoke    rspec
      create      spec/helpers/users_helper_spec.rb
$

で、使ってないので削除とのこと。

$ rm -rf spec/views
$ rm -rf spec/helpers

例によって試験を書く模様。spec/controllers/users_controller_spec.rb とのことで以下。

require 'spec_helper'

describe UsersController do

  describe "GET 'new'" do
    it "should be successful" do
      get 'new'
      response.should be_success
    end
  end
end

あら? デフォで上記だな。users_controller.rb も new なメソドがあります。今ってデフォな試験はパスする形なのかな。

$ bundle exec rspec spec/
.............

Finished in 0.87498 seconds
13 examples, 0 failures
$

そうらしい。これから記述を追加していくのか。まず試験を追加。spec/controllers/users_controller_spec.rb で以下。

require 'spec_helper'

describe UsersController do
  render_views

  describe "GET 'new'" do
    it "should be successful" do
      get 'new'
      response.should be_success
    end

    it "should have the right title" do
      get 'new'
      response.should have_selector("title", :content => "Sign up")
    end
  end
end

タイトルな試験が追加されてますな。こんどこそ試験 red か。

なんか盛大にメセジが出力されたので一部のみ。
>||
Finished in 0.4702 seconds
10 examples, 1 failure

users_controller.rb を以下に。

class UsersController < ApplicationController
  def new
    @title = "Sign up"
  end

end

試験 green です。

$ bundle exec rspec spec/controllers/
..........

Finished in 0.37897 seconds
10 examples, 0 failures
$

次は spec/requests/layout_links_spec.rb な試験を云々とのこと。signup を追加するのか。

require 'spec_helper'

describe "LayoutLinks" do
  .
  .
  .
  it "should have a signup page at '/signup'" do
    get '/signup'
    response.should have_selector('title', :content => "Sign up")
  end
end

とりあえず試験 red を確認

Finished in 0.23217 seconds
5 examples, 1 failure

で、routing を云々するのか。

SampleApp::Application.routes.draw do
  get "users/new"

  match '/signup',  :to => 'users#new'

  match '/contact', :to => 'pages#contact'
  match '/about',   :to => 'pages#about'
  match '/help',    :to => 'pages#help'

  root :to => 'pages#home'
  .
  .
  .
end

うーん。なんか routes.rb 他所のエディタで開いてるみたいなんだけど。
で、signup_path なナニを盛り込むのか。以下は app/views/pages/home.html.erb です。

<h1>Sample App</h1>

<p>
  This is the home page for the
  <a href="http://railstutorial.org/">Ruby on Rails Tutorial</a>
  sample application.
</p>

<%= link_to "Sign up now!", signup_path, :class => "signup_button round" %>

ここでとりあえず一旦終了らしい。

$ bundle exec rspec spec/
...............

Finished in 0.54433 seconds
15 examples, 0 failures
$

試験 green も確認。sighup なリンクから何かが出るのも確認。とりあえず master に merge しておきます。Exercises なナニはまた別途で。

$ git add .
$ git status
# On branch filling-in-layout
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   app/controllers/users_controller.rb
#       new file:   app/helpers/users_helper.rb
#       new file:   app/views/layouts/_footer.html.erb
#       new file:   app/views/layouts/_header.html.erb
#       new file:   app/views/layouts/_stylesheets.html.erb
#       modified:   app/views/layouts/application.html.erb
#       modified:   app/views/pages/home.html.erb
#       new file:   app/views/users/new.html.erb
#       modified:   config/routes.rb
#       new file:   public/images/logo.png
#       deleted:    public/index.html
#       new file:   public/stylesheets/custom.css
#       new file:   spec/controllers/users_controller_spec.rb
#       new file:   spec/requests/layout_links_spec.rb
#
$ git commit -m "Finished layout and routes"
$ git checkout master
$ git merge filling-in-layout

途中から出力略してます。