👻

Rails Tutorial 8メモ

2025/01/11に公開

ターミナル知識

パイプ

コマンドの結果を次のコマンドに渡せる

$ コマンド1 | コマンド2

grep

引数の文字列でフィルターをかけて出力する
例) マークダウンファイルのみ出力する

$ ls -la | grep .md

rails command

rails routes

全ルーティングを表示する

$ rails routes

特定のテストのみ実行

$ rails test test/integration/users_login_test.rb

ヘルパー

form_withヘルパー

model: @userと記載するだけでactionは/usersにPOSTすると判定してくれる

form_with(model: @user)

modelがない場合(sessionへのpostなど)はスコープを指定する

form_with(url: login_path, scope: :session)

login_pathへPOSTで、パラメータはparams[:session][:name]みたいな感じで取得できる

Session関係

cookieを使った一時セッション

ブラウザを閉じると自動的に有効期限が切れるセッションcookie
sessoinメソッドを使用する
ブラウザ内の一時cookieに暗号化済みのユーザーIDが自動で作成される

session[:user_id] = user.id

セッションの取り出し

user_id = session[:user_id]

セッションリセット

reset_session

loginでの使用

SessionHelperで定義しておくと良い
SessionHelperはApplicationControllerでincludeしておくと、どのコントローラからも呼べて便利

SessionHelper
module SessionHelper
  # 渡されたユーザーでログインする
  def log_in(user)
    session[:user_id] = user.id
  end
end
ApplicationController
class ApplicationCnotroller < ActionController::Base
  include SessionHelper
end

Rails(Ruby)でよく使われる書き方

メモ化(memoization)

一時変数にDBから取得した値を保持し、DBアクセス数を減らすテクニック

if @current_user.nil?
  @current_user = User.find_by(id: session[:user_id])
else
  @current_user
end

or演算子

if @current_user.nil?
  @current_user = User.find_by(id: session[:user_id])
else
  @current_user
end

これをor演算子を使えば

@current_user = @current_user || User.find_by(id: session[:user_id])

と書ける
Rubyの || はOrElse(短絡評価...short-circuit evaluation)
&& はAndAlso

ぼっち演算子(safe navigation演算子)

&.を用いて obj && obj.methodの記載をobj&.methodのように記載できる

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

user&.authenticate(params[:sessoin][:password])

RailsにJavaScriptを追加する方法

Importmapという手法を使用する
gem: importmap-rails
下記のコードのおかげでRailsのフロントエンド技術(Turbo, Stimulus)をスムーズに利用できている

app/assets/config/manifest.js
//= link_tree ../../javascript .js
//= link_tree ../../../vender/javascript .js
app/views/layouts/application.html.erb
<%= javascript_importmap_tags %>

カスタムJavaScriptコードがapp/javascript/customにあると認識させる方法

config/importmap.rb
pin_all_from "app/javascript/custom", under: "custom"

app/javascript/customに追加したJSファイルはapplication.jsでimportする必要がある

ルーティング

redirect_to userredirect_to user_url(user)が同じ理由
→ルーティングヘルパーの仕組みとredirect_toメソッドの挙動によって同じ遷移先になる
→modelのインスタンス(@user)をredirect_toに渡すと、自動的にuser_path(@user) または user_url(@user)を指定することになる
→routes.rbでusersをリソース指定してるから可能

redirect_to current_userredirect_to user_path(current_user)が同じ理由

テスト

テストデータの作成

fixtureでテストデータベースに読み込んでおくことができる
test/fixtures/〇〇.ymlで記述する
ymlファイル内でERBを使用してメソッド呼び出しすることが可能

test/fixtures/users.yml
micheal:
  name: Michael Example
  email: micheal@example.com
  pasword_digest: <%= User.digest('password') %>

上記を定義したことによって、テストコードではuser = users(:micheal)でデータを参照できる

リダイレクト先が正しいかチェック

# リダイレクト先が正しいかどうかチェック
assert_redirect_to @user

# 実際にリダイレクト先へ移動
follow_redirect!

flash

flashだと別ページにリダイレクトしても残ったままの可能性がある
flash.nowだとレンダリングが終わっているページで特別にフラッシュメッセージを表示できる
その後、リクエストが発生した時に、このフラッシュメッセージは消える

status

status: :see_other ... RailでTurboを使うときは300:see otherを指定して、
Deleteリクエスト後のリダイレクトが正しく振る舞うようにする必要がある

単語系メモ

  • HTTP
    • ステートレスなプロトコル
    • State(状態が)Less(ない)
  • Session
    • 半永続的な接続
  • Cookie
    • Sessionを実装する方法、ユーザーのブラウザに保存される小さなテキストデータ
  • セッションリプレイス攻撃
    • ユーザーのSessionIDを手に入れて、なりすまして攻撃する手法
  • セッション固定
    • 攻撃者が既に持っているSessionIDをユーザーに使わせる攻撃
    • ログインする直前にSessionをリセットすることで対策が可能
    • 常に新しいSessionIDが使われる
  • fixture(フィクスチャ)
    • testデータを作成するやつ?
  • アサーション
    • テストのassert〇〇のこと
    • 日本語訳: 主張・確認

今後しっかり調べたいこと

  • Active Model Naming
  • polymorphic_pathヘルパー

todoという名の言い訳...

「エンジニアが一生困らない ドキュメント作成の基本」を読んでから書き直す

※初学者のため、誤りがあるかもしれません。
※何かあればご指摘いただけますと幸いです。

Discussion