🌷

Rails チュートリアル 7章

に公開

まえがき

Railsチュートリアル7章において押さえておいた方がいいポイントをまとめ、7章の学習内容を俯瞰し整理することを目的とする。


変更を加えたファイル

ファイル名 説明
application.html.erb デバッグ情報表示を追加
custom.scss デバック情報・サイドバー・gravatar・フォーム・エラーメッセージflashの表示設定を追加
routes.rb Usersリソースの追加
users_controller.rb show,newアクションそれぞれに内容を追加,createアクション,初期化ハッシュのためのuser_paramas関数を新規作成
users_helper.rb Usersコントローラに関連づけられているヘルパーメソッドであり、全ビューから参照可能
new.html.erb 新規ユーザー登録に用いるビューであり、初期設定からフォームを入力する形に変更
production.rb 本番環境でより安全なTLSを用いるための修正
puma.rb PumaというHTTPサーバーを用いるために記述する
Gemfile 本番環境のデータベースでPostgreSQLが使えるように修正
database.yml 本番環境データベースを指定するため修正

作成したファイル

ファイル名 作成方法 説明
show.html.erb 手動 ユーザー情報表示のためのビュー
users_signup_test.rb generate integration_testにより自動生成 有効/無効なユーザーに対する統合テスト。つまり、フォーム送信に関する統合テスト。
_error_messages.html.erb 手動。ディレクトリshareddも同様。 エラーメッセージ表示用のパーシャル

デバッグ情報の確認

ビューのHTMLコードの中にdebug(params)を呼び出すことで実際のサイトからYAML形式のデバック情報を確認することができる。また、アクション内にdebuggerと記述することで、Railsサーバにおいてデバッグ情報を確認することも可能。

そもそもparamsとはなんなのか?

自分で用意する必要はなく、HTTPリクエストのパラメータを格納しているハッシュのことを指す。リクエストを送った時点で自動的に情報が入る。


コントローラとルーティング

コントローラは扱うデータの種類などといった機能ごとに分けて作られるものであり、現時点でsample_appにおいて使用されているコントローラは以下の2つである。

  • static_pages_controller.rb・・・静的ページを扱うためのコントローラ
  • users_controller.rb・・・ユーザ情報を扱うためのコントローラ

RESTfulコントローラ

以下のようにルーティングファイルに、コントローラ名を与えて設定しておけば、自動で7つのアクションへのルーティングが行える(Rails 2章参照)

routes.rb
resources :users

この7つのアクションに関しては、URLに対してHTTP標準操作(POST,GET,PATCH,DELETE)のいずれかのリクエストを発行した際に紐づいて自動的に実行されるということである。

コントローラとビュー

一体どのような流れでビューが表示されるのか?
コントローラ内のアクションの名前とビューファイルの名前が一致している場合に、そのアクション実行時、自動的にビューが表示されるようになっている。例えば、コントローラにアクション"show"があったとき、アクション"show"が呼ばれると"show.html.erb"を自動表示!という仕組みになっている。流れとしては以下。

  1. ルータに対して、リクエストが送られる。ex) users/show
  2. ルーティングファイルに指定されたルートをもとにアクションを呼び出し ex)コントローラusersのアクションshowを呼び出し
  3. アクションの内容を実行し、ビューをレンダリング(ビューファイルに従ってHTMLを生成) ex) show.html.erbをレンダリング
  4. HTMLがHTTPレスポンスとしてブラウザに送信される ex)ブラウザにユーザ情報を表示

paramsとデータベース

HTTPリクエストの内容を自動でハッシュとしてまとめて入れておいてくれるのがparamsであり、params[:id]のようなものを参照することはできる。
ただし、ユーザ情報を取得する必要がある場合(GET,PATCH,DELETE)は、paramsに含まれる探し出したいユーザについての情報はこのidのみであるため、これをもとにデータベースからカラムを取り出す必要がある。そこで、データベースとのやり取りを行う"モデル"のクラス(Userなど)を呼び出して、その中でそのカラムを見つけ出す必要がある。

(補足)paramsの中身

  • 共通
    • コントローラ名
    • アクション名
  • 独自
    • ユーザ情報(ハッシュuser)
      • POST(create)
      • PATCH(update)
    • id
      • GET(show,edit)
      • PATCH(update)
      • DELETE(destroy)

そもそもヘルパーファイルって??

呼び出すと便利な関数を提供するファイルのことだが、有効範囲に注意。

  • application_helper
    このヘルパーのみ、全コントローラ配下の全ビューにおいてincludeなしで使用可能。erbタグ<%=%>で埋め込めば良い。
  • それ以外の名前_helper
    その名前と一致するコントローラ配下の全ビューにおいてincludeなしで使用可能。erbタグ<%=%>で埋め込めが良い。

その他したこと

  • Gravatarでメールアドレスと画像を紐付け、ヘルパーにメソッドを定義することで表示可能にした。
  • 新しく表示するようにした内容についてscssを追加した。
  • form_withというメソッドを呼び出し、中で、label(labelタグを生成),〇〇_field(type=〇〇のinputタグを生成),submit(type=submitのinputタグを生成)などを用いてフォームを作成した。
  • 安全のため、アクションcreateを行う際のインスタンス変数の初期化をrequire,permitを用いて工夫した。
  • 英語の単数形複数形を変更してくれるpluralizeメソッドを使った
  • フォーム送信に関するテストにおいて、拒否すべきメールアドレスについてはUser.countが変化しない、(assert_no_difference)性質を用いて、受理すべきメールアドレスについてはUser.countが1増える(assert_difference User.count、1)性質を用いてテストを記述した。
  • createが成功した後、/user/idに飛べるように(リダイレクト)した。
  • リダイレクトした直後のページではflashに代入したメッセージを表示可能。
  • 本番環境においてTLSを使用させ量に、production.rbを修正
  • Pumaを使うため、ファイル内容を修正
  • データベースでPostgreSQLを用いるためGemfileにpgを追加
  • 本番向けデータベースを指定するため、database.ymlを修正
  • RenderでPostgreSQLを作成
  • Renderの環境として新たにDATABASE_URLを追加。PostgreSQLのInternal Database URLの値で設定する。

Discussion