Rails Tutorial 8メモ
ターミナル知識
パイプ
コマンドの結果を次のコマンドに渡せる
$ コマンド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しておくと、どのコントローラからも呼べて便利
module SessionHelper
# 渡されたユーザーでログインする
def log_in(user)
session[:user_id] = user.id
end
end
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)をスムーズに利用できている
//= link_tree ../../javascript .js
//= link_tree ../../../vender/javascript .js
<%= javascript_importmap_tags %>
app/javascript/custom
にあると認識させる方法
カスタムJavaScriptコードがpin_all_from "app/javascript/custom", under: "custom"
app/javascript/custom
に追加したJSファイルはapplication.jsでimportする必要がある
ルーティング
redirect_to user
とredirect_to user_url(user)
が同じ理由
→ルーティングヘルパーの仕組みとredirect_to
メソッドの挙動によって同じ遷移先になる
→modelのインスタンス(@user)をredirect_to
に渡すと、自動的にuser_path(@user)
または user_url(@user)
を指定することになる
→routes.rbでusersをリソース指定してるから可能
redirect_to current_user
とredirect_to user_path(current_user)
が同じ理由
テスト
テストデータの作成
fixtureでテストデータベースに読み込んでおくことができる
test/fixtures/〇〇.yml
で記述する
ymlファイル内でERBを使用してメソッド呼び出しすることが可能
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