Railsチュートリアルさらっと復習
Railsチュートリアルをもとに話したり教えたりする機会がちらほら出てきた。復習しておく
1章, 2章
/emoji/tea.iconさらっと読んだ
データ「ソース」まで言ってあげると意味が伝わる
よくユーザーデータとか言ってしまっていた
code:plain
bundle lock --add-platform x86_64-linux
指定したアーキテクチャに合うgemを入れるようにできる
3章
git switchの話が出てきて-cはcreateぽいことがわかった
確かにcheckoutで他の操作もできてしまうからこっちに統一したほうがいいかも
あるんだろうと思って使ってなかったショートカット
ターミナルで単語ごとにカーソルをジャンプして移動するには、以下のショートカットキーを使用します。
macOS や Linux の場合:
単語ごとに前へ移動: Option + ←(または Alt + ←)
単語ごとに後ろへ移動: Option + →(または Alt + →)
マイグレーションファイルが消えた場合のロールバックってどうするといいんだっけ
現在のマイグレーションは、VERSION=20220407092210のようにマイグレーションの作成日時のみ指定可能
STEPとかも指定できるっぽいが、普通に気をつけるのが一番良さそう
コントローラーのテストでタイトルの内容とかをチェックしている🤨
code:ruby
require "test_helper"
class StaticPagesControllerTest < ActionDispatch::IntegrationTest
test "should get home" do
get static_pages_home_url
assert_response :success
assert_select "title", "Home | Ruby on Rails Tutorial Sample App"
end
end
あまり書いたことないかも。
/static_pages/homeにアクセスするとhome.html.erbの内容がHTMLに変換され、<%= yield %>の位置に挿入される
結局yieldってどこのメソッドなんだろう。
4章
<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
このおかげで全てのメディアタイプで使えるようになる。
プリントの時にCSSが反映されない、みたいなこともあるのだろうか。
0からインデックス始まるのゼロオリジンっていうんだ
7からrangeとincludeなんか変わった気がする
日時のrange内に値が含まれているかどうかのチェックにRange#include?を利用できるようにするサポート(非推奨化済み)を削除。
これか。
自分が書いたこの記事大丈夫だっけ?と思ったらcover?使ってたし問題なさそう。
code: ruby
{ :name => "Michael Hartl" } == { name: "Michael Hartl" }
=> true
/emoji/tea.icon 同じ文字列を何度も使う場合よりもメモリ使用量とパフォーマンスの面で有利
クラス
BasicObjectクラスを継承していて、これが "Rubyではあらゆるものがオブジェクトである" ことの技術的な理由です。
RubyGoldでやったやつ
blankとempty
code: blank_empty.rb
> " ".empty?
=> false
> " ".blank?
=> true
これ気をつけないと事故りそう。
なんだMetalって...
Rackのinterfaceを提供しているらしい
render機能とかは持っていない小さなコントローラーみたいな感じか?
あまり参考記事も出てこなかったのでこのままにしておく
5〜6章
5章はレイアウトの章
imageタグ
該当する画像ファイルを、アセットパイプラインを通してapp/assets/images/から探す
アセットパイプライン
アセットディレクトリ、マニフェストファイル、プリプロセッサエンジンが主要な機能
アセットディレクトリ
静的ファイルを目的別に分類する、標準的な3つのディレクトリ
マニフェストファイル
どのように1つのファイルにまとめるのかをRailsに指示する
プリプロセッサエンジン
前処理をするもの
/emoji/tea.icon これがerbをHTMLにしてくれるとかかな
6章はモデルの章
ORM使えばいかにSQLのDDLが隠蔽されているかわかる
valid?はDBにあるかどうかは気にしない
valiadtionにformatのオプションがある
has_secure_password
カラムにpassword_digestが必要
password属性とpassword_confirmation属性に対してバリデーションをする機能も(強制的に)追加されている
7章
参考記事:
debuggerメソッド、binding.pryの違いをまとめてみた。
byebugってlsとか使えたんだ...
(rdbg)
(rdbg) ls # outline command
ActiveSupport::Configurable#methods: config
AbstractController::Base#methods:
action_methods action_name action_name= available_action? controller_path inspect response_body
ActionController::Metal#methods:
content_type content_type=
Digest::MD5::hexdigestでgravatarの画像出るんだ
マスアサインメント脆弱性
一括代入の穴をついて意図していない値を差し込む
ストパラで防ぐ
TLS
方式
SSL
TLSの前
カスタムドメインのTLSをCloudflareで扱う場合は、Railsアプリ側でTLS/SSLを強制的に有効にする設定を行ってはいけません。
リダイレクトループを生んじゃうそう。
8章
sessionはブラウザ閉じると終わり。cookieは維持する
小ネタ:rails routes | grep users
sessionメソッド
すでに用意されている。ハッシュのように扱える
とても参考になる。読む
アプリケーションの controller にsession:hogeと書くと、リクエストが来たときに、その controller の継承元クラスである ActionController::Metal がdelegateしている ActionDispatch::Request::Session クラスのオブジェクトであるsessionのインスタンスメソッドである[]メソッドが呼び出される はえ〜
/emoji/tea.icon sessionはRailsのコントローラーでは直接定義されておらず、ActionController::Metalを通じてActionDispatch::Request::Sessionにデリゲートされている
実態はこれ
/emoji/tea.icon 実際には、Railsのミドルウェアを経由してセッションデータがMemcachedなどからロードされる
/emoji/tea.icon ミドルウェア(Middleware)とは説明するとしたら、リクエストとレスポンスの間に入って、追加の処理を行うプログラムでいいだろうか
セッション固定:攻撃者が既に持っているセッションidをユーザーに使わせるように仕向ける
code:ruby
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash:success = "Welcome to the Sample App!" redirect_to @user
else
render 'new', status: :unprocessable_entity
end
end
JSアセットのパッケージ化は現在ではImportmapと呼ばれる手法によって標準化されている
/emoji/tea.icon JSの便利なライブラリ群ををどう管理するかということ
アプリケーション > cookieで確認できる
BCrypt::Password.create(string, cost: cost)
string: ハッシュ化する文字列
cost: コストパラメータ(ハッシュ計算のコストを設定)
コストが高いほど、ハッシュの生成に時間がかかる
コストが高いほど、ハッシュから元のパスワードを推測しにくくなる
9章
方針
ランダムな文字列を生成し、記憶トークンとして使用
記憶トークンはハッシュ化してDBに保存
記憶トークンをブラウザのcookiesに保存する際は、有効期限を設定
cookiesに保存する際、ユーザーIDを暗号化して保存
ブラウザのcookiesに暗号化されたユーザーIDがあれば、それを復号してDBで検索し、ハッシュ値と照合
照合に成功すれば、セッションを復元する
想定正解は「ハッシュ値と共にデータベースに保存する」
bcryptはソルト使っている
ハッシュ値だけ見ても、2人が同じパスワードを使っているかどうかは判断できないから安心
code:plain
irb(main):003> User.last.remember
User Load (0.1ms) SELECT "users".* FROM "users" ORDER BY "users"."id" DESC LIMIT ? "LIMIT", 1
TRANSACTION (0.1ms) begin transaction
TRANSACTION (45.2ms) commit transaction
=> true
こんな感じで保存できる
code:rb
def remember(user)
user.remember
cookies.permanent.encrypted:user_id = user.id end
暗号化されている場所に保存される、みたいな感じなのかな。この辺り若干違和感ある
うまく自分で説明できない。
/emoji/ruby.icon 複数ブラウザでremeber meを実装するという方法もある。管理用のテーブル使うなど。
9章はまた後で眺めるのが良いかも。
10章
UserのCRUD、さらっと読んだ
11章
アカウントの有効化
これにもtokenを使ってあげる発想
アカウントの有効化という作業を「リソース」としてモデル化する
確かにメール入れた後リンク踏んで有効化とかある
Time.nowだとシステムの方の参照してしまう
token認証系で再利用できる部分が多いからメタプロ使用している
ユーザーの初期状態を「未有効化」に設定
ユーザー登録時に有効化トークンと対応するダイジェストを生成
saveではなくcreateコールバック
ダイジェストをDBに保存し、トークンを有効化メールのリンクに含めて送信
ユーザーがリンクをクリックしたら、メールアドレスでユーザーを検索し、ダイジェストとトークンを比較して認証
認証成功後、ユーザーのステータスを「有効化済み」に変更
改めて、ダイジェストとはトークンをハッシュ化(暗号化)した値
トークンをハッシュ化して検証する
アカウントのメール再発行とかはダイジェストの更新もしないといけないな
11章もまた復習するのが良いかも。9章と合わせて。
12章
トークンも平文でDBに保存しないこと
有効期限チェックの実装も必要
@user.create_reset_digestをしてからメールを送る
before_action :check_expiration, only: [:edit, :update]を設定
code:ruby
def create_reset_digest
self.reset_token = User.new_token
update_columns
end
13章
普段やってる感じ
14章
ここも普段やっている感じだが、Hotwire部分は初
code:ruby
respond_to do |format|
format.html { redirect_to @user }
format.turbo_stream
end
こんな感じでTurboのリクエストに対応
format.turbo_streamを追加する
Railsが以下のフォームテンプレートERBファイルを探索する
呟き
海外の人が使うサービス、さらにはそのサービスで生活する人のサービス作るってすごいなぁ
Cloudflare知ってたけど使ったことなかった。自分でも触ってみるべきか。
リメンバー・ミー
今度見よう。