エンジニア志望のブログ

Railsチュートリアル第9章

はじめに
Ruby on Railsチュートリアル(第6版)のメモ、演習の解答例を記述した記事です。
解答は個人のものなので、誤りがあればご指摘ください。
開発環境  Ruby: 2.7.2 , Rails: 6.1.4

メモ

Remember me機能

ユーザーのログイン状態を、ブラウザを閉じたあとでも有効にする機能
sessionメソッドを利用したブラウザへのセッション情報は安全が保たれるが、ブラウザを閉じるセッション情報は消えてしまう
そこで、セッションの永続化をcookiesメソッドを利用し、安全性を加味しながら実現する

セッション

一時セッション :ブラウザを閉じると消えるセッションの事(sessionメソッドを利用)
永続的セッション:ブラウザを閉じても半永久的に消えないセッション(cookiesメソッドを利用)

cookieメソッドでの永続化によるデメリット

cookiesメソッドでは永続的にログインした状態が保たれるが、セッションハイジャック攻撃を受ける可能性がある。

セッションハイジャックの主な手法

  1. 管理の甘いネットワークを通過するネットワークパケットからパケットスニッファというソフトでcookieを直接取り出す
  2. データベースから記憶トークンを取り出す
  3. クロスサイトスクリプティングを使う
  4. ユーザがログインしているパソコンやスマホを直接操作してアクセス権を奪い取る
セッションの永続化

セッションの永続化を実現するためには

永続セッション実装の流れ
 記憶トークンをデータベースに保存するためにUserテーブルにremember_digestカラムを追加
 記憶トークンを生成する(ランダムな文字列を生成しこれを記憶トークンとして利用)
 ユーザーオブジェクトに記憶トークンを記憶させる
 ハッシュ化した記憶トークンをデータベース(Userテーブルのremember_digestカラム)に登録
 ユーザーオブジェクトの記憶トークンとユーザーIDをcookiesメソッドを利用してブラウザに保存

トーク

パスワードと同じような秘密情報

パスワードとトークンの一般的な違い
 ・パスワード:ユーザが作成、管理する情報
 ・トークン :コンピュータが作成、管理する情報

記憶トーク

ランダムな文字列を利用

SecureRandom.urlsafe_base64

ランダムな22文字の文字列を生成する

cookiesメソッドで状態を保持

sessionのようにハッシュとして扱う
cookiesは1つのvalueとオプションのexpires(有効期限)を持つ

記憶トークンをブラウザに記憶
cookies[:remember_token] = { value:   remember_token,
                             expires: 20.years.from_now.utc }

valueに記憶トークンをexpiresに有効期限を渡す。
次のコードも同じ処理をする

cookies.permanent[:remember_token] = remember_token

有効期限を20年とする設定がよく使われるため上記のようなpermanentというメソッドが追加された。

ユーザーIDをブラウザに記憶

signedメソッドで暗号化(署名付きcookie)、permanentメソッドで20年保持

cookies.permanent.signed[:user_id] = user.id

cookiesから暗号化されたユーザーIDを取り出す

cookies.signed[:user_id]

cookies.signed[:user_id]では自動的にcookiesの暗号化を解除し、
続いてbcryptを使ってcookies[:remember_token]がremember_digestと一致するかの確認をする

永続的セッションの削除

cookiesメソッドでブラウザのcookie情報を削除する

cookies.delete(:user_id) #ユーザーIDを削除
cookies.delete(:remember_token) #記憶トークンを削除

assignsメソッド

コントローラーのアクションが実行された後に、コントローラーで定義されたインスタンス変数を参照する。

9.3.1の演習1ではlogin_pathにPOSTリクエストを送りsession_controllerのcreateアクションが実行されたため、このcreateアクションで定義されたインスタンスメソッドを参照している。

raiseメソッド

プログラムの中で意図的に例外を発生させる

herokuメンテナンスモード

メンテナンスモードをオンにすることでページにアクセスできない状態にする。

メンテナンスモードをオン

$ heroku maintenance:on

メンテナンスモードをオフ

$ heroku maintenance:off

演習

9.1.1

演習1

コンソールを開き、データベースにある最初のユーザーを変数userに代入してください。その後、そのuserオブジェクトからrememberメソッドがうまく動くかどうか確認してみましょう。また、remember_tokenとremember_digestの違いも確認してみてください。

remember_digestにはremember_tokenをハッシュ化し値が保存されている。

irb(main):001:0> user = User.first
   (0.4ms)  SELECT sqlite_version(*)
  User Load (0.1ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
irb(main):002:0> user.remember
  User Update (0.3ms)  UPDATE "users" SET "updated_at" = ?, "remember_digest" = ? WHERE "users"."id" = ?  [["updated_at", "2021-07-11 08:36:08.652655"], ["remember_digest", "$2a$12$1VR./gDUj1Tt8XBN/SA3UO.TyXAKajeuN1868HOW7U1GsULWC9rX2"], ["id", 1]]
  TRANSACTION (0.6ms)  commit transaction
=> true
irb(main):003:0> user.remember_token
=> "AHgb7ct6KjACo4zSQ2ye2A"
irb(main):004:0> user.remember_digest
=> "$2a$12$1VR./gDUj1Tt8XBN/SA3UO.TyXAKajeuN1868HOW7U1GsULWC9rX2"

9.1.2

演習2

コンソールを開き、リスト 9.6のauthenticated?メソッドがうまく動くかどうか確かめてみましょう。

irb(main):001:0> user = User.first
   (0.5ms)  SELECT sqlite_version(*)
  User Load (0.1ms)  SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ?  [["LIMIT", 1]]
=> #<User id: 1, name: "Rails Tutorial", email: "example@railstutorial....
irb(main):002:0> user.remember
  User Update (0.3ms)  UPDATE "users" SET "updated_at" = ?, "remember_digest" = ? WHERE "users"."id" = ?  [["updated_at", "2021-07-11 09:13:30.028775"], ["remember_digest", "$2a$12$YPaIMQRoOJV/a0Qp08e9Lu431JW2QKMu787PgwLVDfid8pHxfiy.a"], ["id", 1]]
  TRANSACTION (0.6ms)  commit transaction
=> true
irb(main):003:0> user.authenticated?(user.remember_token)
=> true

9.3.1

演習1

リスト 9.25の統合テストでは、仮想のremember_token属性にアクセスできないと説明しましたが、実は、assignsという特殊なテストメソッドを使うとアクセスできるようになります。コントローラで定義したインスタンス変数にテストの内部からアクセスするには、テスト内部でassignsメソッドを使います。このメソッドにはインスタンス変数に対応するシンボルを渡します。例えばcreateアクションで@userというインスタンス変数が定義されていれば、テスト内部ではassigns(:user)と書くことでインスタンス変数にアクセスできます。本チュートリアルのアプリケーションの場合、Sessionsコントローラのcreateアクションでは、userを(インスタンス変数ではない)通常のローカル変数として定義しましたが、これをインスタンス変数に変えてしまえば、cookiesにユーザーの記憶トークンが正しく含まれているかどうかをテストできるようになります。このアイデアに従ってリスト 9.27とリスト 9.28の不足分を埋め(ヒントとして?やFILL_INを目印に置いてあります)、[remember me]チェックボックスのテストを改良してみてください。

createアクション

  def create
    @user = User.find_by(email: params[:session][:email].downcase)
    if @user&.authenticate(params[:session][:password])
      log_in @user
      params[:session][:remember_me] == '1'? remember(@user) : forget(@user)
      redirect_to user_url(@user)
    else
      flash.now[:danger] = 'Invalid email/password combination' 
      render 'new'
    end
  end

統合テスト

  test "loin with remembering" do
    log_in_as(@user, remember_me: '1')
    assert_equal cookies[:remember_token], assigns(:user).remember_token
  end

おわりに

9章は内容が一気に難しくなった気がします。
処理が複雑になり、どう動いているか意識しながら進めないと混乱しますね、、

Railsチュートリアル第8章

はじめに
Ruby on Railsチュートリアル(第6版)のメモ、演習の解答例を記述した記事です。
解答は個人のものなので、誤りがあればご指摘ください。
開発環境  Ruby: 2.7.2 , Rails: 6.1.4

メモ

認証システム

ログイン済みのユーザーがブラウザを閉じたらログイン状態を破棄する仕組みのこと

認可モデル

ユーザーがログインしているかどうかで使える機能やアクセスできるページを制御すること

セッション

ユーザの状態を保持するためのもの。
Railsでセッションを実装する最も一般的な方法はcookiesを使う方法。
cookiesはブラウザに保存されるテキストデータ。

cookiesに状態を保存する方法は二種類
 ・sessionメソッド:ブラウザを閉じると自動的にセッションの有効期限が切れる。
 ・cookiesメソッド:ユーザーがログアウトなどをして意図的にセッションを削除しないとブラウザを閉じてもセッションは長期的にブラウザに保たれる。
sessionメソッドの場合cookiesを盗み出されても盗まれたcookiesでログインされることはない。


Railsのメソッドであるsessionメソッドを利用してユーザの状態を保存する。

session[:user_id] = user.id

セッションを使う際は、Railsの全コントローラの親であるApplicationControllerにセッション用のヘルパーモジュールを読み込ませる必要がある。

class ApplicationController < ActionController::Base
  include SessionsHelper
end

セッションの削除

session.delete(:user_id)

fixture

テスト時にログインできるかどうか検証するためにあらかじめデータを設定しておく必要がある。
このようなテスト用のデータをfixtureで作成できる。

ぼっち演算子

if user && user.authenticate(params[:session][:password])

が次のように書ける

if user&.authenticate(params[:session][:password])

演習

8.2.4

演習1

リスト 8.15の8行目にあるif userから下をすべてコメントアウトすると、ユーザー名とパスワードを入力して認証しなくてもテストが通ってしまうことを確認しましょう(リスト 8.26)。通ってしまう理由は、リスト 8.9では「メールアドレスは正しいがパスワードが誤っている」ケースをテストしていないからです。このテストがないのは重大な手抜かりですので、テストスイートで正しいメールアドレスをUsersのログインテストに追加して、この手抜かりを修正してください(リスト 8.27)。テストが red (失敗)することを確認し、それから先ほどの8行目以降のコメントアウトを元に戻すと green (パス)することを確認してください。

  test "login with valid email/invalid password" do
    get login_path
    assert_template 'sessions/new'
    post login_path, params: { session: { email: @user.email, password: "invalid"}}
    assert_template 'sessions/new'
    assert flash.any?
    get root_path
    assert flash.empty?
  end

if user から下をコメントアウトしてテスト(RED)

yuy@yu sample_app % rails test
Running via Spring preloader in process 53231
Started with run options --seed 3080

 FAIL["test_login_with_valid_email/invalid_password", #<Minitest::Reporters::Suite:0x0000000136ce2b38 @name="UsersLoginTest">, 0.40365799999563023]
 test_login_with_valid_email/invalid_password#UsersLoginTest (0.40s)
        expecting <"sessions/new"> but rendering with <[]>
        test/integration/users_login_test.rb:35:in `block in <class:UsersLoginTest>'

  24/24: [=============================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.63630s
24 tests, 62 assertions, 1 failures, 0 errors, 0 skips

コメントアウトを消してテスト(GREEN)

Running via Spring preloader in process 53284
Started with run options --seed 17884

  24/24: [=============================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.72054s
24 tests, 64 assertions, 0 failures, 0 errors, 0 skips

おわりに

演習の解答を書くと言っておいて全然記述しいてなくてすみませんm(__)m
コンソールで確認する演習やブラウザで確認する演習は手間がかかるので、、

ぼっち演算子の名前が面白くてすこし調べてみたところ&.が一人でしゃがんでるように見えるからだとか、、
確かに見えなくもないですね笑

折り返し地点にきました!
引き続き頑張ります!!

Railsチュートリアル第7章

はじめに
Ruby on Railsチュートリアル(第6版)のメモ、演習の解答例を記述した記事です。
解答は個人のものなので、誤りがあればご指摘ください。
開発環境  Ruby: 2.7.2 , Rails: 6.1.4

メモ

debugger

byebug gemのdebuggerメソッドをコード内に埋め込むことで埋め込んだ箇所の状況を調べることができる。
調べたあとはコード内からdebuggerを取り除く必要がある。

ヘルパー

form_with

form_withヘルパーはAcrive Recordのオブジェクトを取り込み、取り込んだオブジェクトの属性を使ってフォームを構築する。
参考:form_with | Railsドキュメント

content_tag

HTMLとERBが混ざっているときに置き換えるとコードが簡潔になる。
7.4.4の演習2を参照
参考:
content_tag | Railsドキュメント

ストロングパラメータ

マスアサインメントの脆弱性を対策するためのもの。
必須のパラメータと許可されたパラメータを指定して受け取ることができる。
こうすることで意図的にパラメータを書き換えられることを防ぐ

params.require(:user).permit(:name, :email, :password, :password_confirmation)

必須の属性を:userとし、名前、メールアドレス、パスワード、パスワードの確認を許可している。それ以外のパラメータはエラーとして弾くようになっている。

flash

一度だけメッセージなどを表示したいときに使う。
flashはハッシュのような使い方をする。

flash[:success] = "Welcome to the Sample App!"

参考:flash | Railsドキュメント

演習

7.3.4

演習1

リスト 7.20で実装したエラーメッセージに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト 7.25にテンプレートを用意しておいたので、参考にしてください。

POSTリクエストを送信した際のエラーメッセージを追加

  test "invalid signup information" do
    get signup_path
    assert_no_difference "User.count" do
      post users_path, params: { user: { name: "", email: "user@invalid", password: "foo", password_confirmation: "bar" } }
    end
    assert_template 'users/new'
    assert_select 'div#error_explanation'
    assert_select 'div.field_with_errors'
    assert_select 'li', "Name can't be blank"
    assert_select 'li', "Email is invalid"
    assert_select 'li', "Password confirmation doesn't match Password"
    assert_select 'li', "Password is too short (minimum is 6 characters)"
  end

7.4.4

演習1

7.4.2で実装したflashに対するテストを書いてみてください。どのくらい細かくテストするかはお任せします。リスト 7.32に最小限のテンプレートを用意しておいたので、参考にしてください(FILL_INの部分を適切なコードに置き換えると完成します)。ちなみに、テキストに対するテストは壊れやすいです。文量の少ないflashのキーであっても、それは同じです。筆者の場合、flashが空でないかをテストするだけの場合が多いです。

  test "valid signup information" do
    get signup_path
    assert_difference "User.count", 1 do
      post users_path, params: { user: { name: "Example User", email: "user@example.com", password: "password", password_confirmation: "password" }}
    end
    follow_redirect!
    assert_template 'users/show'
    assert_not flash.empty?
  end
演習2

本文中でも指摘しましたが、flash用のHTML(リスト 7.29)は読みにくいです。より読みやすくしたリスト 7.33のコードに変更してみましょう。変更が終わったらテストスイートを実行し、正常に動作することを確認してください。なお、このコードでは、Railsのcontent_tagというヘルパーを使っています。

<div class="alert alert-<%= message_type %>"><%= message %></div>

HTMLとERBが混在しているコードをcontent_tagで置き換えると

<%= content_tag(:div, message, class: "alert alert-#{message_type}")%>
演習3

リスト 7.26のリダイレクトの行をコメントアウトすると、テストが失敗することを確認してみましょう。

# redirect_to user_url @user

テストの結果

yuy@yu sample_app % rails test
Running via Spring preloader in process 45196
Started with run options --seed 2921

ERROR["test_valid_signup_information", #<Minitest::Reporters::Suite:0x0000000114b9c728 @name="UsersSignupTest">, 0.32726700004423037]
 test_valid_signup_information#UsersSignupTest (0.33s)
RuntimeError:         RuntimeError: not a redirect! 204 No Content
            test/integration/users_signup_test.rb:24:in `block in <class:UsersSignupTest>'

  20/20: [=============================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.42140s
20 tests, 47 assertions, 0 failures, 1 errors, 0 skips
演習4

リスト 7.26で、@user.saveの部分をfalseに置き換えたとしましょう(バグを埋め込んでしまったと仮定してください)。このとき、assert_differenceのテストではどのようにしてこのバグを検知するでしょうか? テストコードを追って考えてみてください

  def create
    @user = User.new(user_params)
    if false
      flash[:success] = "Welcome to the Sample App!"
      redirect_to user_url @user
    else
      render 'new'
    end
  end

POSTリクエストを送信したあとのデータベースの変化についてエラーが出ている。

yuy@yu sample_app % rails test     
Running via Spring preloader in process 46971
Started with run options --seed 47383

 FAIL["test_invalid_signup_information", #<Minitest::Reporters::Suite:0x000000011fc5b988 @name="UsersSignupTest">, 0.45664799999212846]
 test_invalid_signup_information#UsersSignupTest (0.46s)
        Expected at least 1 element matching "div#error_explanation", found 0..
        Expected 0 to be >= 1.
        test/integration/users_signup_test.rb:11:in `block in <class:UsersSignupTest>'

 FAIL["test_valid_signup_information", #<Minitest::Reporters::Suite:0x000000011fc50cb8 @name="UsersSignupTest">, 0.4575549999717623]
 test_valid_signup_information#UsersSignupTest (0.46s)
        "User.count" didn't change by 1.
        Expected: 1
          Actual: 0
        test/integration/users_signup_test.rb:21:in `block in <class:UsersSignupTest>'

  20/20: [=============================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.51240s
20 tests, 42 assertions, 2 failures, 0 errors, 0 skips

おわりに

本章の終わりに本番環境の設定をしましたが、そこではセキュリティ面とユーザーが利用しやすい環境を作ることが大切だということが窺えました。

引き続き次の章もがんばります!!

Railsチュートリアル第6章

はじめに
Ruby on Railsチュートリアル(第6版)のメモ、演習の解答例を記述した記事です。
解答は個人のものなので、誤りがあればご指摘ください。
開発環境  Ruby: 2.7.2 , Rails: 6.1.4

メモ

Active Record

データベースとやり取りをするデフォルトのライブラリ
このライブラリのおかげで直接SQL文を書かずにRailsのメソッドでデータベースを操作できる。
(O/Rマッピング)
Active Recordはデータオブジェクトの作成、保存、検索のためのメソッドを持っている。

マイグレーション

ActiveRecordの機能のひとつ
マイグレーションRubyを記述することでテーブルの作成、変更を行うことができる。
マイグレーションを実行することを「マイグレーションの適用」と呼ぶ。

$ rails db:migrate

スキーマ

データベースの構造を追跡するために使われる。
db/schema.rb

コンソール(サンドボックスモード)

データベースを変更したくないときに使う

$ rails console --sandbox

モデル

モデルの生成

$ rails generate model モデル名(単数形)

作成したモデルはApplicationRecordを継承している。
ApplicationRecordはActive Recordを継承している。
つまり生成したモデルはActive Recordのメソッドが使える

CRUD

データベースの操作を表す「Create」、「Read」、「Update」、「Delete」の頭文字。
Active RecordはCRUDのメソッドを生成するのでActive Recordを継承したモデルでもこれらのメソッドを利用できる。
 例:user.new, user.find, user.update, user.destroy ...
 update_attributeメソッドは検証を回避して更新することができる
参考:Active Record の基礎 - Railsガイド

検証

ActiveRecordでは検証(Validation)という機能でモデルの属性に制約を課すことができる。
 よく使われるバリデーションヘルパー
  ・存在性 (presence)
  ・長さ (length)
  ・フォーマット (format)
  ・一意性 (uniqueness)
  ・確認 (confirmation)
参考:Active Record バリデーション - Railsガイド

有効性の検証

バリデーション機能が正常に動いているかはテストで確かめる

  1. 有効なモデルのオブジェクトを作成
  2. 作成したオブジェクトのうちの1つを有効でない属性に意図的に変更する
  3. バリデーションで失敗するかテストする
  4. テストが成功するようにモデルにバリデーションを設定する
  5. テストが成功するか確認する
一意性の検証

モデルの一意性を検証するときにメモリ上だけでなく実際にレコードをデータベースに登録して検証する必要がある。
テスト上で登録したレコードは"db/test.sqlite3"のテスト用のデータベースに保存される。

  test "email addresses should be unique" do
    duplicate_user = @user.dup      #dupでオブジェクトを複製
    @user.save      #db/test.sqlite3のデータベースに登録
    assert_not duplicate_user.valid?
  end

インデックス

通常テーブルの中から特定のカラムを検索するとき、テーブルの上から下まで探したいカラムを闇雲に探す。
このままだと、数千人、数万人が登録されたデータベースから一人を探すのは時間がかかる、
そこでインデックスを使うと早く検索できるらしい、、

indexを追加する

$ rails generate migration add_index_to_テーブル名_カラム名

生成されたmigrationファイルは以下のようになる。

class AddIndexToテーブル名 < ActiveRecord::Migration
  def change
    add_index :テーブル名, カラム名[, unique: true ]
  end
end

Railsチュートリアルでは"unique: true"を追加して一意性を強制している。
参考:データベースにindexを張る方法 - Qiita

コールバック

オブジェクトの保存、更新、削除の際に処理を実行させる
コールバックを使う際は慎重に、、、
苦しめられてやっと理解できたRailsコールバックの使い方 - KitchHike Tech Blog

reloadメソッド

現在のデータベースと同じ値に更新する。

user = User.new( name: "user", email: "user@example.com" )
=> #<User id: nil, name: "user", email: "user@example.com", created_at: nil, updated_at: nil, password_digest: nil>
user.save
=> true
user.name = "hogehoge"
=> "hogehoge"
user.reload.name
=> "user"

セキュアなパスワード

パスワード、パスワードの確認をユーザーに入力してもらい、そのデータをハッシュ化してデータベースに保存することで安全性を保つ。

ハッシュ化されたパスワードを保存するには
  1. モデルにpassword_digesカラムを追加する
  2. ハッシュ関数を導入する(bcrypt)
  3. モデルでhas_secure_passwordメソッドを呼び出す

has_secure_passwordを呼び出したモデルは以下の機能が使えるようになる
・ハッシュ化したパスワードをpassword_digestに保存できるようになる
・ペアの仮想的な属性であるpasswordとpassword_confirmationが使えるようになる
 存在性とpasswordとpassword_confirmationが一致するかどうかのバリデーションも追加される
・authenticateメソッドが使えるようになる

おわりに

6章ではUserテーブルを作りバリデーションの設定、セキュアなパスワードの追加をしました。

has_secure_passwordの力恐るべしです。

Railsチュートリアル第5章

はじめに
Ruby on Railsチュートリアル(第6版)のメモ、演習の解答例を記述した記事です。
解答は個人のものなので、誤りがあればご指摘ください。
開発環境  Ruby: 2.7.2 , Rails: 6.1.4

メモ

ヘルパー

5章で新出のヘルパー

リンクを生成する。

link_to( テキスト, パス [, HTML属性 ] )
image_tag

イメージタグを生成する。
app/assets/images配下に画像を置いた場合の例

image_tag("rails.svg", alt: "Rails logo", width: "200px")
render

ビューファイルを指定して表示する。

render( '表示させたいファイルのパス' )

アセットパイプライン

個別のアセット(画像、CSSJavaScript)を最小化、圧縮、連結する一連の機能のこと。
サーバーへのリクエストを減らしたりファイルの使用頻度を減らすというメリットがある。

3つの主要な機能

 ・アセットディレクト
 ・マニフェストファイル
 ・プリプロセッサエンジン

アセットディレクト

アセットパイプラインで使うアセットを格納する場所のこと。
  標準的なアセットディレクト
  ・app/asets
  ・lib/assets
  ・vender/assets

マニフェストファイル

アセットをどのように1つのファイルにまとめるかをRailsに指示するためのファイルのこと。
 実際にアセットをまとめる処理を行うのはSprocketsというgem
 ※Rails6からはwebpackが採用されている

<%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>

デフォルトで作成されるファイルのhead内には上記の記述がある
つまりデフォルトでは
assets/stylesheets/application.css
assets/javascripts/aapplication.js
マニフェストファイルとして指定している

プリプロセッサエンジン

マニフェストファイルを用いてアセットを統合しビュー用に準備する。

参考:Rails初学者がつまずきやすい「アセットパイプライン」

名前付きルート

get  '/help', to: 'static_pages#help'

上記のようにルートを設定するとhelp_pathやhelp_urlのような名前付きルートを使えるようになる。
help_pathとhelp_urlでは返す値が違う。

help_path -> '/help'
help_url  -> 'https://www.example.com/help'

Railsチュートリアルでは基本的に〇〇_pathを使い、リダイレクトするときのみ〇〇_urlを使う。HTTPの標準としてはリダイレクトするときは完全なURLが要求されるから_urlを使う。

統合テスト

複数のアプリケーションの機能が連動しているか、そして連動している処理が正常に動くかを確かめるテストのこと。

$ rails generate integration_test 統合テスト名

演習メモ

5.3.4の演習でApplicationヘルパーをテストで使えるようにインクルードしている。

おわりに

5章ではメインページのレイアウトを作成して、リンクを追加することで別のページと行き来することができるようになりました。

アセットパイプラインが雰囲気しかわかっていないからちゃんと理解しないと、、、

今度テストについてまとめたいです!

Railsチュートリアル第4章

はじめに
Ruby on Railsチュートリアル(第6版)のメモ、演習の解答例を記述した記事です。
解答は個人のものなので、誤りがあればご指摘ください。
開発環境  Ruby: 2.7.2 , Rails: 6.1.4

メモ

ヘルパー

ヘルパーはビューで使うための関数のこと。
これによりビューを効率よくシンプルに書くことができる。
HTML生成を行うものやURLを生成するメソッドなどがある。

組み込みヘルパー

Railsにはじめから組み込まれているヘルパーのこと。

組み込みヘルパーの例

 ・link_to
 ・form_with
 ・image_tag

カスタムヘルパー

自分で新しく作成したヘルパーのこと。
カスタムヘルパーは"app/helpers"配下のモジュールに記述していく。
"application_helper.rb"にはアプリケーション全体で利用するヘルパーを定義する。
参考に、"user_helper.rb"ではuser配下で利用するヘルパーを定義する。
また、Railsではヘルパーモジュールを自動的に読み込んでくれるのでincludeする必要がない。

Railsコンソール

次のコマンドで起動

$ rails console
Loading development environment

コンソールにはdevelpment、test、productionの3種類がありデフォルトではdevelopmentで起動される。

括弧の省略

関数の最後の引数にハッシュを渡すとき波括弧を省略することができる。

stylesheet_link_tag 'application', media: 'all',
                                       'data-turbolinks-track': 'reload'

省略せずに書くと

stylesheet_link_tag( 'application', { media: 'all',
                                       'data-turbolinks-track': 'reload' } )

第1引数:スタイルシートへのパス
第2引数:" media: 'all' " -- メディアタイプ
     " 'data-turbolinks-track': 'reload' " --turbolinks機能をオン

おわりに

4章では主にRubyの文法についての内容でした。
Rubyの文法についての章なのに文法のことを特に記述していませんね笑

次の章からこのRubyの基礎を意識しながらアプリを作っていきます。

Railsチュートリアル第3章

はじめに
Ruby on Railsチュートリアル(第6版)のメモ、演習の解答例を記述した記事です。
解答は個人のものなので、誤りがあればご指摘ください。
開発環境  Ruby: 2.7.2 , Rails: 6.1.4

メモ

開発中の失敗をもとに戻す方法

コントローラの自動生成と取り消し

取り消す場合はコントローラとそれに対応するアクションを記述

$ rails generate controller コントローラ名(複数形) アクション名
$ rails destroy  controller コントローラ名(複数形) アクション名

コントローラの命名規則

モデルの自動生成と取り消し

モデル名以外の引数は不要

$ rails generate model モデル名(単数形)
$ rails destroy model モデル名(単数形)

モデルの命名規則

マイグレーションの変更とロールバック
$ rails db:migrate
$ rails db:rollback
$ rails db:version #現在のマイグレーションの状況

テスト駆動開発(TDD)

テスト手法のひとつ。
プログラムを実装する前にテストコードを書き、そのテストコードに適合するようにプログラムを実装、リファクタリングしていく手法。

$ rails test      #Railsのテストスクリプト

コントローラやモデルの単体テストを先に行い、続いて統合テストを行っていく。

RED? GREEN?

多くのテストツールでは、テストの失敗をRED、成功をGREENと表現する。
テスト駆動開発のサイクルを「RED・GREEN・REFACTOR」と呼ぶこともある。

RubyDRY原則

Don't Repeat Yourself の略で同じことを繰り返さないようにすること。
同じコードがあればひとつにまとめる。

application.html.erbのhead部

<%= csrf_meta_tags %>
<%= csp_meta_tag %>

csrf_meta_tagsタグ :クロスサイトリクエストフォージェリー攻撃を緩和
csp_meta_tagタグ :クロスサイトスクリプティング攻撃を緩和

おわりに

人生初めての投稿、、!
ブログってこんな感じでいいのかな?とか思いながらひたすらメモを書き殴っただけの投稿になってしまった笑
今回はてな記法を使って記事を書いてみましたがMarkdownも試してみたい!