スポンサーリンク
Railsチュートリアル7章を走破しました。
#Railsチュートリアル の第7章を走破しました! https://t.co/qluZpzQdFu @RailsTutorialJP#プログラミング学習 #駆け出しエンジニアと繋がりたい
— じゅに💻脱サラに命かける人 (@Jyu210) December 11, 2019
スポンサーリンク
Railsチュートリアル7章の内容
- ユーザー登録フォームを作成
- ユーザー表示ページを作成
7.1 ユーザーを表示する
7.1.1 デバッグとRails環境
- アプリケーションのレイアウトファイル(app/views/layouts/application.html.erb)に以下を追加することで、「debugメソッド」と「params変数」を使って、デバッグ情報を表示できるようになる
12345678910111213141516<!DOCTYPE html><html>...<body><%= render 'layouts/header' %><div class="container"><%= yield %><%= render 'layouts/footer' %># ↓を追加<%= debug(params) if Rails.env.development? %># ↑を追加</div></body></html> - 上記の「if Rails.env.development?」という記述でデバッグ情報の表示を開発(development)環境のみとしている
- Railsにはテスト環境(test)、開発環境(development)、本番環境(production)の3つの環境が用意されており、デフォルト環境は開発環境である
- Railsにはrailsというオブジェクトが存在し、環境の論理値を取得できるenvという属性を持っている
例:Rails.env.test?:テスト環境=true、それ以外の環境=falseとなる - rails consoleを環境指定で起動するには以下のコマンドを実行する(指定しない場合は開発環境となる)
1$ rails console test - Railsサーバーを環境指定で起動するには以下のコマンドを実行する(指定しない場合は開発環境となる)
1$ rails server --environment production - データベースの更新(マイグレーション)を環境指定で実行するには以下のコマンドを実行する(指定しない場合は開発環境となる)
1$ rails db:migrate RAILS_ENV=production - Heroku上の環境でコンソールを起動したい場合は以下のコマンドを実行する
1$ heroku run rails console - デバッグ情報の内容は「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)に置くと利便性が高い(ヘルパーファイルに定義すると全てのビューで利用できるため)
ソースコードの例は下記のとおり
123456789module UsersHelper# 引数で与えられたユーザーのGravatar画像を返すdef gravatar_for(user)gravatar_id = Digest::MD5::hexdigest(user.email.downcase)gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"image_tag(gravatar_url, alt: user.name, class: "gravatar")endend
7.2 ユーザー登録フォーム
7.2.1 form_forを使用する
- 「form_forヘルパーメソッド」を使用することでformを生成することができる
- 「form_forヘルパーメソッド」はActive Recordのオブジェクトを取り込んで、そのオブジェクトの属性を使ってフォームを構築できる
- 「form_forヘルパーメソッド」の引数で必要となるオブジェクトはコントローラにインスタンス変数として定義する
7.2.2 フォームHTML
- 「form_forヘルパーメソッド」は1つの変数を持つブロックを取る
- ブロック変数はHTMLフォーム要素(テキスト、ラジオボタンなど)に対応するメソッドが呼び出されると、「form_forヘルパーメソッド」の引数の属性を設定するために特別に設計されたHTMLを返す
- form_forの参考URLは下記サイトを参照(RailsチュートリアルではUser登録フォームを作成するためという観点での説明であるため、一般的な解釈が欲しかった)
Railsのform_forの使い方が リファレンス見てもいまいちわからなかったので 俺式に全力で整理してみた
【Rails初心者向け】form_for メソッドを5分で理解しよう!
7.3 ユーザー登録失敗
7.3.1 正しいフォーム
- renderメソッドはアクションでも動作する
- formのパラメータは以下のようなイメージとなる
123456# Railsチュートリアルでの例params => { "user" => { inputタグのnmae属性 => フォームの入力値,"email" => "foo@invalid","password" => "[FILTERED]","password_confirmation" => "[FILTERED]"}
7.3.2 Strong Parameters
- formから送信されたparam[:user]をUser.newに丸ごと渡すのはセキュリティ上よくないので、「User.new(params[:user」とするとエラーとなる
- 上記は「Strong Parameters」を使用して必須のパラメータと許可されたパラメータを指定することができる(以下のようにチェックする)
1params.require(:user).permit(:name, :email, :password, :password_confirmation) - 「Strong Parameters」のチェックはprivateメソッドとして外だしし、外部から使用できないようにする
7.3.3 エラーメッセージ
- エラーメッセージの表示などの複数のビューで使用されるパーシャルは専用のディレクトリ「shaerd」に格納する
- 「オブジェクト.errors.count」はエラーの数を返す
- 「オブジェクト.errors.any?:は要素が1つでも存在する婆はtrueを返す
- 「helpler,pluralize(整数値, “英単語”)」は整数値に基づき第2引数の英単語を複数形にしたものを返す
7.3.4 失敗時のテスト
- Railsはフォーム用のテストを書くことができるので、自動化できない
- 統合テストのファイル名はコントローラの慣習では「リソース名は複数形」にちなんで、複数形にする
1$ rails generate integration_test ファイル名(複数形) - テストの順番は以下のとおり
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を有効化する方法
- SSLを有効化するには「config/environments/production.rb」の「config.force_ssl」という値をtrueに変更する
- 「config/puma.rb」にHerokuのPumaドキュメントにしたがって設定を記述する
- ルートディレクトリ(Gemfileと同じディレクトリ)に「procfile」というファイルを作成し、以下のコードを記述する
1web: bundle exec puma -C config/puma.rb
感想
個人的にテストに対する理解が低いと感じる。
これまでになんとくな書いていたコードに対しての理解をもっとするようにこころがけないといけないと思いましたね。
RailsチュートリアルはTwitterっぽいアプリを作成するための説明になりがちになっているところがあるよに思えるので、それをどれだけ他のアプリに応用できるように解釈するかがポイントかなと。
一応ブログに構文書く時はそのあたりを意識はしているけど、中々難しいですね。
Railsチュートリアルで記述されている「users」がモデルなのかコントローラなのかリソースなのかオブジェクトなのか・・・。
ここをきちんとおさえて理解しないといけないと思ってます。
とはいえ、今は「こんなことができる」、「こんな考え方をする必要がある」のほうが重量だと思うので、とりあえず突き進んでみます。
スポンサーリンク