<!DOCTYPE html>
<html>
.
.
.
<body>
<%= render 'layouts/header' %>
<div class="container">
<%= yield %>
<%= render 'layouts/footer' %>
<%= debug(params) if Rails.env.development? %>
</div>
</body>
</html>
デバッグ情報は開発環境のみに表示されるようになる
controller: static_pages
action: home
paramsに含まれてる内容でYAMLという形式で書かれている
RESTの原則に従う場合、リソースへの参照はリソース名とユニークなIDを使うのが普通
例)
ユーザーをリソース
id=1のユーザーを参照する
⇢ /users/1というURLに対してGETリクエストを発行する
ここでいうshowアクションは暗黙のリクエストになる
<%= @user.name %> , <%= @user.email %>
def show
@user = User.find(params[:id])
end
ユーザーのid読み出しにはparamsを使用
Usersコントローラにリクエストが正常に送信されると
params[:id]の部分はユーザーidの1に置き換わる
params[:id]は文字列型の'1'だが
findメソッドでは自動的に整数型に変換される
7.2 ユーザー登録フォーム
<%= form_for(@user) do |f| %>
.
.
.
<% end %>
doキーワードは、form_forが1つの変数を持つブロックを取ることを表す
fはformのf
<%= f.label :name %>
<%= f.text_field :name %>
Userモデルのname属性を設定する、ラベル付きテキストフィールド要素を作成するのに必要なHTMLを作成
"user" => { "name" => "Foo Bar",
"email" => "foo@invalid",
"password" => "[FILTERED]",
"password_confirmation" => "[FILTERED]"
}
上のハッシュはUsersコントローラにparamsとして渡される
このparamsハッシュには各リクエストの情報が含まれてる。
ユーザー登録情報の送信の場合、paramsには複数のハッシュに対するハッシュ(入れ子になったハッシュ)が含まれる。
上のデバッグ情報では、フォーム送信の結果が、送信された値に対応する
属性とともにuserハッシュに保存される
7.3.2 Strong Parameters
以前のバージョンのRails
モデル層で attr_accessible
メソッドを使ってた
Rails 4.0
コントローラ層で Strong Parameters
を使うことが推奨されている
Strong Parameters を使って
必須のパラメータと許可されたパラメータを指定することができる。
paramsハッシュをまるごと渡すとエラーが発生するので、Railsはデフォルトでマスアサインメントの脆弱性から守られるようになった。
paramsハッシュでは:user
属性を必須として、名前、メールアドレス、パスワード、パスワードの確認の属性をそれぞれ許可してそれ以外を許可しないようにしたいと考えてる
params.require(:user).permit(:name, :email, :password, :password_confirmation)
このパラメータを使いやすくするために、user_paramsという外部メソッドを使うのが
慣習になっている
@user = User.new(user_params)
このuser_params
メソッドはUsersコントローラの内部でのみ実行され、Web経由で外部ユーザーにさらされる必要はないため、privateキーワードを使って外部から使えないようにする
7.3.3 エラーメッセージ
errors.full_messages
オブジェクトはエラーメッセージの配列を持っている
shared/error_messages
Rails全般の慣習として、複数のビューで使われるパーシャルは専用のディレクトリshared
によく置かれる
7.3.4 失敗時のテスト
新規ユーザー登録用の統合テストを生成
$ rails g integration_test users_signup
invoke test_unit
create test/integration/users_signup_test.rb
ユーザー登録ボタンを押した時に(ユーザー情報が無効だから)ユーザーが作成されないことを確認
getメソッドでユーザー登録ページアクセス
get signup_path
フォーム送信をテストするには users_pathに対してPOSTリクエストを送信する必要がある。これはpostメソッドを使って実現する
assert_no_difference 'User.count' do
post users_path, params: {user: {name: "",
email: "user@invalid",
password: "foo",
password_confirmation: "bar"}}
end
assert_no_difference メソッドのブロック内でpostを使い、メソッドの引数には'User.count'を与える。これはassert_no_differenceのブロックを実行する前後で引数の値(User.count)が変わらないことをテストしている。
⇢ ユーザー数を覚えた後にデータを投稿してみて、ユーザーが変わらないかどうかを検証するテスト
まとめ
debugメソッドを使うことで、役立つデバッグ情報を表示できる
Sassのmixin機能を使うと、CSSのルールをまとめたり他の場所で再利用できるようになる
Railsには標準で3つ環境が備わっており、それぞれ開発環境 (development)、テスト環境 (test)、本番環境 (production)と呼ぶ
標準的なRESTfulなURLを通して、ユーザー情報をリソースとして扱えるようになった
Gravatarを使うと、ユーザーのプロフィール画像を簡単に表示できるようになる
form_forヘルパーは、Active Recordのオブジェクトに対応したフォームを生成する
ユーザー登録に失敗した場合はnewビューを再描画するようにした。その際、Active Recordが自動的に検知したエラーメッセージを表示できるようにした
flash変数を使うと、一時的なメッセージを表示できるようになる
ユーザー登録に成功すると、データベース上にユーザーが追加、プロフィールページにリダイレクト、ウェルカムメッセージの表示といった順で処理が進む
統合テストを使うことで送信フォームの振る舞いを検証したり、バグの発生を検知したりできる
セキュアな通信と高いパフォーマンスを確保するために、本番環境ではSSLとPumaを導入した