現在、私のURLはとして表示されていますwww.website.com/entries/1が、として表示させたいと思いますwww.website.com/title-of-entry。私はいじり回して、URLに表示routesするタイトルを取得できましたentryが、RailsはentryIDを指定しないとを見つけることができません。IDをパラメータと一緒に送信すると、URLはとして表示されwww.website.com/title-of-entry?=1ます。とにかく、IDをパラメーターとしてURLに表示せずにIDを渡すことはできますか?ありがとう!
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 に答える