Rails

挫折しないRailsチュートリアルまとめ【第7章】

Railsチュートリアル7章を走破しました。

Railsチュートリアル7章の内容

  • ユーザー登録フォームを作成
  • ユーザー表示ページを作成

7.1 ユーザーを表示する

7.1.1 デバッグとRails環境

  • アプリケーションのレイアウトファイル(app/views/layouts/application.html.erb)に以下を追加することで、「debugメソッド」と「params変数」を使って、デバッグ情報を表示できるようになる
  • 上記の「if Rails.env.development?」という記述でデバッグ情報の表示を開発(development)環境のみとしている
  • Railsにはテスト環境(test)、開発環境(development)、本番環境(production)の3つの環境が用意されており、デフォルト環境は開発環境である
  • Railsにはrailsというオブジェクトが存在し、環境の論理値を取得できるenvという属性を持っている
    例:Rails.env.test?:テスト環境=true、それ以外の環境=falseとなる
  • rails consoleを環境指定で起動するには以下のコマンドを実行する(指定しない場合は開発環境となる)
  • Railsサーバーを環境指定で起動するには以下のコマンドを実行する(指定しない場合は開発環境となる)
  • データベースの更新(マイグレーション)を環境指定で実行するには以下のコマンドを実行する(指定しない場合は開発環境となる)
  • Heroku上の環境でコンソールを起動したい場合は以下のコマンドを実行する
  • デバッグ情報の内容は「params変数」に含まれている内容でYAMLという形式だが、基本的にはハッシュで、コントローラとページのアクションを一意に指定する

7.1.2 Usersリソース

  • 「/user/id」というURLにアクセスするためにルーティングファイル(config/routes.rb)に「resources :users」という記述を追加することで、RESTに応じたルーティングの設定が生成される
  • Railsのデータを表示する標準的なページは「app/views/コントローラ名/show.html.erb」に作成する。
  • HTTPリクエスのパラメータは「params[:キー]」に格納されている

7.1.3 debuggerメソッド

  • byebug gemの「debuggerメソッド」を使用すると直接的にデバッグすることができる
  • デバッグしたい箇所(変数などの値を確認したい箇所)に「debugge」で記述した状態で、該当ページにアクセスすると、rails serverを起動しているターミナルでデバッグすることができる

7.1.4 Gravatar画像とサイドバー

  • Gravatarはプロフィール写真をアップロードして、メールアドレスと関連つけることができる無料のWebサービス
  • GravatarのURLはメールアドレスをMD5という仕組みでハッシュ化している
  • MD5は大文字と小文字が区別される
  • Rubyでは「Digestライブラリ」の「hexdigestメソッド」を使うことでMD5へのハッシュ化は可能
  • Gravatarの画像を使用する場合は、Usersコントローラに関連付けられているヘルパーファイル(app/helpers/users_helper.rb)に置くと利便性が高い(ヘルパーファイルに定義すると全てのビューで利用できるため)
    ソースコードの例は下記のとおり

7.2 ユーザー登録フォーム

7.2.1 form_forを使用する

  • 「form_forヘルパーメソッド」を使用することでformを生成することができる
  • 「form_forヘルパーメソッド」はActive Recordのオブジェクトを取り込んで、そのオブジェクトの属性を使ってフォームを構築できる
  • 「form_forヘルパーメソッド」の引数で必要となるオブジェクトはコントローラにインスタンス変数として定義する

7.2.2 フォームHTML

7.3 ユーザー登録失敗

7.3.1 正しいフォーム

  • renderメソッドはアクションでも動作する
  • formのパラメータは以下のようなイメージとなる

7.3.2 Strong Parameters

  • formから送信されたparam[:user]をUser.newに丸ごと渡すのはセキュリティ上よくないので、「User.new(params[:user」とするとエラーとなる
  • 上記は「Strong Parameters」を使用して必須のパラメータと許可されたパラメータを指定することができる(以下のようにチェックする)
  • 「Strong Parameters」のチェックはprivateメソッドとして外だしし、外部から使用できないようにする

7.3.3 エラーメッセージ

  • エラーメッセージの表示などの複数のビューで使用されるパーシャルは専用のディレクトリ「shaerd」に格納する
  • 「オブジェクト.errors.count」はエラーの数を返す
  • 「オブジェクト.errors.any?:は要素が1つでも存在する婆はtrueを返す
  • 「helpler,pluralize(整数値, “英単語”)」は整数値に基づき第2引数の英単語を複数形にしたものを返す

7.3.4 失敗時のテスト

  • Railsはフォーム用のテストを書くことができるので、自動化できない
  • 統合テストのファイル名はコントローラの慣習では「リソース名は複数形」にちなんで、複数形にする
  • テストの順番は以下のとおり
    1. getメソッドでformページにアクセス
    2. postメソッドでformへの送信データを作成
    3. assert_no_differenceメソッドでpostした結果でデータの件数が変わってないかをチェック

7.4 ユーザー登録成功

7.4.1 登録フォームの完成

  • 「redirect_toメソッド」を使用すると指定したページを表示することができる

7.4.2 flash

  • 「flash変数」に代入したメッセージはリダイレクトした直後のページで表示できる

7.4.3 実際のユーザー登録

  • 特になし

7.4.4 成功時のテスト

  • テストの順番は以下の通り
    1. getメソッドでformページにアクセス
    2. postメソッドでformへの送信データを作成
    3. assert_differenceメソッドでpostした結果でデータの件数が指定した変わっていることをチェック

7.5 プロのデプロイ

7.5.1 本番環境でのSSL

  • 本番環境をSSLに対応させなければ、アプリケーション全体の欠陥となる

7.5.2 本番環境用のWebサーバー

SSLを有効化する方法
  1. SSLを有効化するには「config/environments/production.rb」の「config.force_ssl」という値をtrueに変更する
  2. 「config/puma.rb」にHerokuのPumaドキュメントにしたがって設定を記述する
  3. ルートディレクトリ(Gemfileと同じディレクトリ)に「procfile」というファイルを作成し、以下のコードを記述する

感想

個人的にテストに対する理解が低いと感じる。

これまでになんとくな書いていたコードに対しての理解をもっとするようにこころがけないといけないと思いましたね。

RailsチュートリアルはTwitterっぽいアプリを作成するための説明になりがちになっているところがあるよに思えるので、それをどれだけ他のアプリに応用できるように解釈するかがポイントかなと。

一応ブログに構文書く時はそのあたりを意識はしているけど、中々難しいですね。

Railsチュートリアルで記述されている「users」がモデルなのかコントローラなのかリソースなのかオブジェクトなのか・・・。

ここをきちんとおさえて理解しないといけないと思ってます。

とはいえ、今は「こんなことができる」「こんな考え方をする必要がある」のほうが重量だと思うので、とりあえず突き進んでみます。

 

ABOUT ME
Jyu2
ソフトウェア会社(SIer)で10年以上勤務のシステムエンジニア|ポケットWiFi使用歴2年以上|ポケットWiFi+αで快適でお得なインターネット環境を構築するための情報を発信|その他、IT情報やWebサービス、アプリ、ガジェットなどの情報を発信|自分と他の人のカバンの中身を紹介するメディア「カバンの中身ラボ(https://kaban-no-nakami-labo.com/)」も運営しています。 ポケットWiFi選びに迷ったらTwitter、お問合せフォームからご連絡ください。