を私は今、そのURLを作成するためのコードがある
パスヘルパーでデフォルト以外の属性を使用して、代わりに:ID
get 'book/:id' => 'books#show', as: :book
のようなルートを持っている私は
を持っている:
book_path @book
コントローラで
:
@book = Book.find(params[:id])
ここまでは順調ですね。さて、このIDは明らかに内部のActiveRecordまたはデータベースの主キーです。
は、私が代わりに
欲しい、私は(この架空の例では)代わりにISBNを使用します。私はそうすることができます:
get 'book/:isbn' => 'books#show', as: :book
book_path(isbn: @book.isbn)
@book = Book.find_by(isbn: params[:isbn])
これは少し冗長です。私はアプリケーション全体でこのモデルのために "isbn"という大会をしたいと思います。誰もそれを気にする必要はありません。ですから、私の3行は次のようになります:
get 'book/:isbn' => 'books#show', as: :book
book_path @book # (!)
@book = Book.find(params[:isbn]) # (!)
私の願いが叶うように経路を設定することは可能ですか?明らかに、これは自動的にを実行します。少なくとも、ユーザーがURLにISBNを表示するGET要求の場合です。
重要な場合は、#isbn
属性は通常の意味での主キーではありませんが、テーブルに特定のISBNを持つレコードが1つしかないことが保証されています。したがって、少なくともプライマリ・キー契約のこの部分は達成されます。
[to_param](https://apidock.com/rails/ActiveRecord/Integration/to_param)メソッドをチェックしましたか? – Sajan
私はしていない!ありがとう、それは素晴らしい作品、2つのより緊急の問題を解決します。後見では、私は '#find'を好むと思うので、とにかく内部IDに固執してください。ミニ回答を作成すると、私の受諾が得られます。 – AnoE