心はいつもAirPucci (空元気でもいいから)

毎日がPucciを着ているような気分

RailsTutorial4.0を高速で復習する。7.1.2章

   


7.1.2ユーザーリソース、です。
/user/newを/signupで表示させるために、routes.rbをこう書いていました。

Twili::Application.routes.draw do
  root  'static_pages#home'
  match '/help',    to: 'static_pages#help',    via: 'get'
  match '/about',   to: 'static_pages#about',   via: 'get'
  match '/contact', to: 'static_pages#contact', via: 'get'

  resources :users
  match '/signup',  to: 'users#new',            via: 'get'
end

resources :usersはもう書いてあるので、RESTfulなルートはあるはず。

HTTPリクエスト URL アクション 名前付きルート 用途
GET /users index users_path すべてのユーザーを表示するページ
GET /users/1 show user_path(user) 特定のユーザーを表示するページ
GET /users/new new new_user_path ユーザーを新規作成するページ (ユーザー登録)
POST /users create users_path ユーザーを作成するアクション
GET /users/1/edit edit edit_user_path(user) id=1のユーザーを編集するページ
PATCH /users/1 update user_path(user) ユーザーを更新するアクション
DELETE /users/1 destroy user_path(user) ユーザーを削除するアクション
表7.1リスト7.3のUsersリソースが提供するRESTfulなルート。

無いのはviewとcontorollerです。

ユーザー個別表示のテストを書く

ユーザー個別表示、ユーザープロファイルページは、本来のRESTful pathなら/users/1で表示します。RailsTutorialは 7.1.2章でshowをとりあえず作ることになっていますが、TDDを優先するため、すっ飛ばします。

7.1.3ファクトリーを使用してユーザー表示ページをテストする、の途中にある、するユーザー表示ページのテストを書きます。

リスト7.9 ユーザー表示ページ用のテスト。
spec/requests/user_pages_spec.rb

require 'spec_helper'

describe "User pages" do

  subject { page }

  describe "profile page" do
    let(:user) { FactoryGirl.create(:user) }
    before { visit user_path(user) }
    #uaser.nameがコンテンツに表示されている
    it { should have_content(user.name) }
    #タイトルにuser.nameがある
    it { should have_title(user.name) }
  end

  describe "signup page" do
    before { visit signup_path }

    it { should have_content('Sign up') }
    it { should have_title(full_title('Sign up')) }
  end
end

let(:user) { FactoryGirl.create(:user) }
で、factorygirlを使って作ったデータがテストで使用されるとのこと。

テストは当然失敗します。

1) ユーザーページのテスト プロファイルページ
Failure/Error: it { should have_title(user.name) }
expected #has_title?(“Michael Hartl”) to return true, got false

別describeで書いてある”signupページのテスト”は当然ながら成功しています。

showを作る

リスト7.10 ユーザーのプロファイルページにタイトルと見出しを追加する。
app/views/users/show.html.erb

<% provide(:title, @user.name) %>
<h1><%= @user.name %></h1>

リスト7.5 Usersコントローラのshowアクション。
app/controllers/users_controller.rb

class UsersController < ApplicationController def show @user = User.find(params[:id]) end 略 end [code][/code] showアクションのためのviewとcontrollerを作るとテストは成功しました。 7.1.4gravatar画像とサイドバー、です。

ユーザー名の横に画像を表示する仕様

画像登録機能とか必要、、とおもってたのですがgravatarを使用するとのこと。gravatar_forヘルパー関数っていうのがrailsにあるそうです。
そしてここで

ビューを作成するときは、ページの構造が正確であるかどうかよりもページの外観の方を重要視するのが普通なので、少なくとも今はビューをテストする必要はありません。

viewにはテスト要らん宣言。いままでのは何だったんだ、、
ページ構成を把握しておくために、タイトルとコンテンツ、リンクのテストくらいはあってもいいのかな。ここら辺のノウハウ誰かに聞いてみたい。

gravaterヘルパーで写真表示

リスト7.12 ユーザー表示ビューに名前とGravatarを表示する。
app/views/users/show.html.erb

<% provide(:title, @user.name) %>
<h1>
  <%= gravatar_for @user %>
  <%= @user.name %>
</h1>

h1で画像も表示するという、みょうなコードですが、viewを変更して/user/1を見ると
gravatar_forが見つからないという旨のエラーがでます。

リスト7.13 gravatar_forヘルパーメソッドを定義する。
app/helpers/users_helper.rb

module UsersHelper

  # 与えられたユーザーのGravatar (http://gravatar.com/) を返す。
  def gravatar_for(user)
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end

これを書くと、画像が表示されます。gravatar_forは自分で提供するメソッドだったのか。

ページにサイドバー追加

webデザイン系作業です。サイドバーを追加します。html5のasideタグでやってます。

リスト7.14 ユーザーのshowビューにサイドバーを追加する。
app/views/users/show.html.erb

<% provide(:title, @user.name) %>
<div class="row">
  <aside class="span4">
    <section>
      <h1>
        <%= gravatar_for @user %>
        <%= @user.name %>
      </h1>
    </section>
  </aside>
</div>

h1あるほうがasideなんですね。なんか変ですが続けます。

リスト7.15 SCSSを使用してサイドバーなどのユーザー表示ページにスタイルを与える。
app/assets/stylesheets/custom.css.scss

.
.
.

/* sidebar */

aside {
section {
padding: 10px 0;
border-top: 1px solid $grayLighter;
&:first-child {
border: 0;
padding-top: 0;
}
span {
display: block;
margin-bottom: 3px;
line-height: 1;
}
h1 {
font-size: 1.4em;
text-align: left;
letter-spacing: -1px;
margin-bottom: 3px;
margin-top: 0px;
}
}
}

.gravatar {
float: left;
margin-right: 10px;
}

ここでいったんコミットします。
次は
7.2ユーザー登録フォーム
です。

 - テクニカル ,

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

no image
Macでアプリを強制終了

Macでアプリを強制終了したことは今までなかったのですが、どうにもftpソフトの …

SublimeText2をMacにインストールしてターミナルから起動できるようにする。

Windowsには秀丸っていう超優秀なテクストエディタがあって、無料でも使えるの …

iPad使用前/使用後、雑感。

5/28にiPadがAppleStoreからクロネコヤマトで届けられました。 週 …

no image
データベースのリファクタリング?

ruby on rails3プリケーションプログラミングの本の内容をruby2. …

no image
RailsTutorial4.0を高速で復習する。5.6章。演習1問目。

5.6演習です。 一問目。 リスト5.28の静的ページのテストコードは簡潔ですが …

no image
RailsTutorial4.0を高速で復習する。6.5章。

演習1問目。 リスト6.20の、メールアドレスを小文字に変換するコードに対するテ …

使ったらダメなiPhoneケーブル

iPhoneのApple純正ケーブルって、はげやすくないですか?iPhone5用 …

no image
RailsTutorial4.0を高速で復習する。7.2章

7.2ユーザー登録フォーム、です。 ユーザー認証も登録も、モデルは作ってあるので …

no image
サイドバーの幅を決めたい(Googleアドセンス編)

サーバー移転したままブログが放置状態になっています。 その間も検索エンジン経由で …

パーフェクトRuby 2章Rubyの基礎 2-5-5 クラスメソッド

p54 2-5-5 クラスメソッド インスタンスメソッドに対して、クラスに対して …