0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Rails tutorial】7章まとめ

Posted at
app/application.hrml.erb
<!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アクションは暗黙のリクエストになる

Screen Shot 0001-11-27 at 12.43.49.png

app/views/users/show.html.erb
<%= @user.name %> , <%= @user.email %>
app/controllers/user_controller.rb
def show
  @user = User.find(params[:id])
end

ユーザーのid読み出しにはparamsを使用
Usersコントローラにリクエストが正常に送信されると
params[:id]の部分はユーザーidの1に置き換わる
params[:id]は文字列型の'1'だが
findメソッドでは自動的に整数型に変換される

Screen Shot 0001-11-27 at 13.06.18.png

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を導入した

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?