Ruby on Rails チュートリアル on Cloud9 の学習録(第7章)
だらだらと今日もRuby on Rails チュートリアルの続きを進めていきます。
本日は第7章。画面作成の無かった第6章に比べて、アップロード内容が劇的に進展していきます。
第7章 ユーザー登録
7.1.1 デバッグとRails環境
<%= debug(params) if Rails.env.development? %>
これをページに挿入すると、開発環境で実行した際に、debugメソッドにparams変数を使ってデバッグ情報を表示してくれるようになります。
第5章で、Sassの機能を使ってネスト構造のCSSを書いたが、ネスト構造は深くなればなるほど理解が難しくなる。本章ではミックスイン機能を使って、CSSをパッケージ化して外だしし、分かりやすいネスト構造を実現している。
@mixin box_sizing {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.
/* miscellaneous */
.debug_dump {
clear: both;
float: left;
width: 100%;
margin-top: 45px;
@include box_sizing;
}
マジックワード、"resource: users"。第6章で作成したモデルから動的にURLを生成する(/users/1 など)を生成することが出来るようになります。ただし、第6章ではモデルは作成しましたが、コントローラーとビュー設定していないので、エラーになります。
resources :usersという行は、動作する /users/1 URLを追加するためだけのものではありません。サンプルアプリケーションにこの行を追加すると、ユーザーのURLを生成するための多数の名前付きルート (5.3.3) に従って、RESTfulなUsersリソースで必要となるすべてのアクションが利用できるようになります。
コントローラーを作成。showアクションがきた場合、URLに含まれるIDのレコードを取得して、@user変数に格納する。
def show
@user = User.find(params[:id])
end
次にビューを作成。showアクションがきた場合、@user変数の内容を表示する。
<%= @user.name %>, <%= @user.email %>
これで、ページが表示できるようになります。
7.1.3ファクトリーを使用してユーザー表示ページをテストする
今更、letメソッドの使い方が分からず、6章のコラムに戻った。使い方は以下の通りで、変数は、beforeやitブロックから利用する事ができる。
let(:変数名) {代入する値}
7.1.4gravatar画像とサイドバー
ユーザー登録を間違えた!コンソールから"example@railstutorial.org"というユーザを作成せよ、という指示があったが、"example@railstutorial.com"と登録してしまった。Railsコンソールから、レコードを操作する事は、そうそうないだろうが、今回は気になったので、レコードを見つけて修正を行った。
# rails コンソールに入る
$ rails c
# レコードを検索してuser変数に格納
> user = User.find_by(name:"Example User")
# レコードを修正
> user.update_attributes(name:"Example User",email:"example@railstutorial.org",password:"foobar",password_confirmation:"foobar")
7.2 ユーザー登録フォーム
レコードの削除は以下のコマンドで行う。
$ rake db:reset
$ rake test:prepare
railsコンソールから、テーブルのレコード数をカウントする。
$ rails c
> User.count
7.2.2 form_forを使用する
最後の方でテストを下がエラーになってしまう…(テスト名は日本語に変更してあります)。コントローラーにcreateが無いと行っているが、チュートリアルのミス?
$ rspec spec/requests/user_pages_spec.rb -e "ユーザー作成ページ"
1) User pages ユーザー作成ページ 異常系テスト 全て空白のまま作成ボタンをクリック
Failure/Error: expect { click_button submit }.not_to change(User, :count)
AbstractController::ActionNotFound:
The action 'create' could not be found for UsersController
# ./spec/requests/user_pages_spec.rb:24:in `block (5 levels) in <top (required)>'
# ./spec/requests/user_pages_spec.rb:24:in `block (4 levels) in <top (required)>'
7.3.1正しいフォーム
上記で、controllerにcreateが無いとrspecに怒られる旨を書いたが、ここの節で作成するものだったらしい(よって、7.2.2のエラーはテストのやり方が悪いという事に)。コントローラーにcreateを作成して、喜び勇んでテストをしたら、今度はforbidden Attribute Error.
1) User pages ユーザー作成ページ 異常系テスト 全て空白のまま作成ボタンをクリック
Failure/Error: expect { click_button submit }.not_to change(User, :count)
ActiveModel::ForbiddenAttributesError:
ActiveModel::ForbiddenAttributesError
# ./app/controllers/users_controller.rb:13:in `create'
# ./spec/requests/user_pages_spec.rb:24:in `block (5 levels) in <top (required)>'
# ./spec/requests/user_pages_spec.rb:24:in `block (4 levels) in <top (required)>'
7.3.3ユーザー登録のエラーメッセージ
pluralizeは素晴らしい機能だが、日本語では関係ないので書き換えた。
<!-- The form contains <%= pluralize(@user.errors.count, "error") %>. -->
<%= @user.errors.count %>つの入力エラーがあります。
...おかしい。Confirmationの部分をブランクにして、ユーザーを作成してもエラーが出ない…とりあえず、致命的ではないと判断して、先に進む。
7.4.2 flash
app/views/layouts/application.html.erb にフラッシュを書き込む事に、もの凄く違和感がある...と、書いたけど、Key-Valueを使って様々なメッセージを出す事ができるから同ファイルに書いていることを後から理解した。
7.4.4 SSLを導入して本番環境をデプロイする
config/environments/production.rbの"config.force_ssl"をtrueにするだけで、本番環境のSSL対応が完了する事にびっくり。
追記: Herokuにアップロードして、ユーザーを作成するところまでは問題なかった。作成されたユーザーIDでパスを切る(/users/1)と、そのユーザーページに飛べてしまう…。後で機能が実装されるのだろうか?
余談:やっべー間違って保存しちゃったっと思ったら
いろいろ編集してファイルを保存してからテストしたら...テスト結果がメチャクチャに...となったら、以下のコマンドを打てば、最後にコミットした状態に戻れます。
$ git checkout .