現在、私のURLはとして表示されていますwww.website.com/entries/1
が、として表示させたいと思いますwww.website.com/title-of-entry
。私はいじり回して、URLに表示routes
するタイトルを取得できましたentry
が、Railsはentry
IDを指定しないとを見つけることができません。IDをパラメータと一緒に送信すると、URLはとして表示されwww.website.com/title-of-entry?=1
ます。とにかく、IDをパラメーターとしてURLに表示せずにIDを渡すことはできますか?ありがとう!
質問する
158 次
2 に答える
1
于 2012-08-02T11:42:37.853 に答える
1
通常、この部分をデータベースに保存する必要がありますtitle-of-entry
(フィールドなどを呼び出しますslug
)。モデルは次のようになります。
class Entry < ActiveRecord::Base
before_validation :set_slug
def set_slug
self.slug = self.title.parameterize
end
def to_param
self.slug
end
end
これで、生成されたルートは次のようになります。/entries/title-of-entry
対応するエントリを見つけるには、コントローラを変更する必要があります。
# instad of this
@entry = Entry.find(params[:id]
# use this
@entry = Entry.find_by_slug(params[:id])
アップデート
覚えておくべきいくつかのこと:
slug
それが一意であることを確認する必要があります。そうでない場合Entry.find_by_slug(params[:id])
は、遭遇したこのスラッグを含む最初のエントリが常に返されます。Entry.find_by_slug(params[:id])
例外は発生しませんActiveRecord::RecordNotFound
が、代わりに。を返しnil
ます。の使用を検討してくださいEntry.find_by_slug!(params[:id])
。ルートをこのように見せたい場合は
/title-of-entry
、後で問題が発生する可能性があります。エントリスラッグが別のコントローラの名前と同じように見える場合、ルータは予期しない結果をもたらす可能性があります。
于 2012-08-02T04:48:37.073 に答える