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

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

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

   


7.2ユーザー登録フォーム、です。

ユーザー認証も登録も、モデルは作ってあるので、viewとcontorollerを作ります。

登録ページのイメージ

signup_mockup_bootstrap
こういうイメージにする、って毎回絵で描いてあるのもRailsTutorialのいいところです。

name,email,password,confirmatin全部モデル作ってあります。

ここでDBリセットしています。
bundle exec rake db:reset
データがなくなるので、現在無いデータを表示できないために画面はエラーになっています。

7.2.1ユーザー登録のためのテスト、です。

カピバラさんの機能でテストを書く

ユーザー登録フォームの表示が失敗しないかどうか、そしてページを表示し、ボタンを押し、無効なデータを送信する動作をシミュレートすることです。

ということがCapybaraさんはできるそうな。

リスト7.16 ユーザー登録の基本的なテスト。
spec/requests/user_pages_spec.rb

require 'spec_helper'

describe "User pages" do

  subject { page }
  .
  .
  .
  describe "signup" do

    before { visit signup_path }

    let(:submit) { "Create my account" }

    describe "with invalid information" do
      it "should not create a user" do
        expect { click_button submit }.not_to change(User, :count)
      end
    end

    describe "with valid information" do
      before do
        fill_in "Name",         with: "Example User"
        fill_in "Email",        with: "user@example.com"
        fill_in "Password",     with: "foobar"
        fill_in "Confirmation", with: "foobar"
      end

      it "should create a user" do
        expect { click_button submit }.to change(User, :count).by(1)
      end
    end
  end
end

viewのテストなんてあまり要らない宣言後のためか、もう書いてしまったタイトルやコンテンツ文字に対するテストが削除されていたりします。

カピバラさんでclickボタンを押してみて結果を見る記述もあります。

テストはエラーです。

1) ユーザーページのテスト signupページのテスト 入力が正しくないとき ボタンを押してもuserを作成しない
Failure/Error: expect { click_button submit }.not_to change(User, :count)
Capybara::ElementNotFound:
Unable to find button “Create my account”
# ./spec/requests/user_pages_spec.rb:28:in `block (5 levels) in
# ./spec/requests/user_pages_spec.rb:28:in `block (4 levels) in

2) ユーザーページのテスト signupページのテスト 正しい入力のとき ボタンを押してuserを作成する
Failure/Error: fill_in “Name”, with: “Example User”
Capybara::ElementNotFound:
Unable to find field “Name”

ユーザー登録の入力フォームを作成する

リスト7.17 新しいユーザーを登録するフォーム。
app/views/users/new.html.erb

<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>

<div class="row">
  <div class="span6 offset3">
    <%= form_for(@user) do |f| %>

      <%= f.label :name %>
      <%= f.text_field :name %>

      <%= f.label :email %>
      <%= f.text_field :email %>

      <%= f.label :password %>
      <%= f.password_field :password %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation %>

      <%= f.submit "Create my account", class: "btn btn-large btn-primary" %>
    <% end %>
  </div>
</div>

余計なタグが入っているのはbootstrapのためです。素直にhtmlで書いた方がわかりやすいのでは、、と思っていましたがだいぶなれてきました。

contorollerも作成します。

リスト7.18 @user変数をnewアクションに追加する。
app/controllers/users_controller.rb

class UsersController &lt; ApplicationController
  .
  .
  .
  def new
    @user = User.new
  end
end

RailsTutorial誤植か?

さて、ここで

bundle exec rspec spec/requests/user_pages_spec.rb -e "signup page"

とすれば、パスするというのですが、確かにエラーは無いのですが0examples 0failureです。

(この-eオプションは、descriptionの文字列が”signup page”に一致する例を単に実行するためのものです。ここで注意していただきたいのは、これは “signup” という部分文字列とは違うということです。もし”signup” であればリスト7.16のすべてのテストが実行されるでしょう。)

bundle exec rspec spec/requests/user_pages_spec.rb -e “signup page” で、
-e “signup page”オプションを指定して、user_pages_spec.rbの部分実行をしています。

が、
リスト7.16 で
describe “signup” do
ってなっているので、
-e “signup page”というキーワード指定では引っかかってくれません。
テストスクリプトが
describe “signup page” doの間違いでは?誤植?

あるいは、コマンドを
bundle exec rspec spec/requests/user_pages_spec.rb -e “signup”
にするとか。

テストスクリプトをdescribe “signup page” doに変更してみたら、-e “signup page”でdescribe “signup page”を引っ張って実行してくれました。

しかし、エラー。
Failure/Error: expect { click_button submit }.not_to change(User, :count)
AbstractController::ActionNotFound:
The action ‘create’ could not be found for UsersController

という。
ボタンを押してcreateまで行っている感じ。createはまだ実装していないので当然エラーに。

stackoverflowに同じ質問が。Michael Hartlが答えていて、失敗でオk、続けろと言っています。この質問者のコマンドが
rspec spec/requests/user_pages_spec.rb -e “signup page”
なのか普通にrspec specなのか書いていないので、わからない。

誤植とテキストのまずい点がうまい具合に重なってしまい、わからない。

ま、
createが無いのでエラーは当然の結果なので続けます。

あー納得がいかないと思いつつCSSを書き足してこの章はおしまいにします。

リスト7.19 ユーザー登録フォームのCSS。
app/assets/stylesheets/custom.css.scss

略
/* forms */

input, textarea, select, .uneditable-input {
  border: 1px solid #bbb;
  width: 100%;
  padding: 10px;
  margin-bottom: 15px;
  @include box_sizing;
}

input {
  height: auto !important;
}

7.2.3フォームHTML、は生成されたHTMLの解説です。飛ばします。
大事なのはここですね。

ユーザーの作成で重要なのはinputごとにある特殊なname属性です。
Railsはこれらのnameの値を使用して、初期化ハッシュを (params変数経由で) 構成しす。このハッシュは、ユーザーが入力した値に基づいてユーザーを作成するときに使用されます。

次は、
7.3ユーザー登録失敗
からです。

 - テクニカル ,

Message

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

  関連記事

Ruby on Railsを4.1.0にバージョンアップする

真央ロス真央廃を超えた腐まお状態な1ヶ月1週間、まるで娘が嫁に行った父親のごとし …

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

8.1.3サインインのフォーム、です。 ログイン画面を作る 入力フォームをfor …

no image
RailsTutorial4.0を高速で復習する。5.4.2章の途中から。

リスト5.35 ボタンをユーザー登録ページにリンクする、です。 リンクを貼る系は …

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

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

no image
before_actionが定義してある。

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

パーフェクトRuby 3章制御構造/メソッド/組み込み関数 3-2 基本的な制御構造

p75 3-2 基本的な制御構造 条件分岐、繰り返し、ジャンプ構文について 3- …

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

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

ブログをアプリを使ってiPhoneから更新

この前の投稿と、前の前の投稿はiphoneから行いました。ノートPCだとブログ投 …

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

6.2.5一意性を検証する、です。メールアドレスをIDとして使うため(でなくとも …

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

9.3.2サンプルのユーザー、です。 Faker gemで、実際にありそうなユー …