0

現在、私の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を渡すことはできますか?ありがとう!

4

2 に答える 2

1

ほとんどのものと同様に、これには宝石があります。

FriendlyID

インストールは簡単で、数分で稼働します。やってみて。

于 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])

アップデート

覚えておくべきいくつかのこと:

  1. slugそれが一意であることを確認する必要があります。そうでない場合Entry.find_by_slug(params[:id])は、遭遇したこのスラッグを含む最初のエントリが常に返されます。

  2. Entry.find_by_slug(params[:id])例外は発生しませんActiveRecord::RecordNotFoundが、代わりに。を返しnilます。の使用を検討してくださいEntry.find_by_slug!(params[:id])

  3. ルートをこのように見せたい場合は/title-of-entry、後で問題が発生する可能性があります。エントリスラッグが別のコントローラの名前と同じように見える場合、ルータは予期しない結果をもたらす可能性があります。

于 2012-08-02T04:48:37.073 に答える