環境
- Ruby 3.0.2
- Rails 6.1.4
前提
ルーティングでURLの動的な値に好きなカラム(今回はuuid
)を指定する。
これによって、/articles/1
などの単純な連番のURLではなく、articles/slug-name
のようにわかりやすいURLやarticles/5Kx8uaDy_Vyn
のような推測されにくいURLを指定することができる。
|
|
|
|
問題点
その1
article_path(article)
のように引数にオブジェクトを渡したときの値が/articles/1
のようになる。
そのため、期待するURLを取得するためにはarticle_path(article.uuid)
のように、引数に値を直接入れる必要がある。
その2
newとeditでフォームを共有しているとき、form_with
でよしなにURLを生成したいときがある。
しかし、単に以下のようにすることはできない。
|
|
これでは、POST /articles
やPATCH /articles/1
のように、:id
のURLになってしまう。
解決法
|
|
または
|
|
で、パスの引数にオブジェクトをまるごと渡したときのカラムを指定できる。
ちなみに、前者は/articles/{uuidの値}
になり、後者は/articles/{idの値}-{uuidの値}
になる。
どちらも、コントローラで取得するparams[:uuid]
の値は同じになる。
余談
ちなみに、これはカラムである必要はないので、
|
|
のようなことも可能ではある。
(ナノ秒単位で同じレコードが存在しないことが前提ではあるが)(ついでに、単純にはfind_byできないですね)(使えるようにカスタマイズする必要はありそう)