1

そこで、Rails アプリにプリティ/SEO フレンドリーな URL スキームを実装しています。Artist というモデルがあり、Railsartist_pathヘルパーが常にわかりやすいバージョンのパスを生成するようにしたいと考えています。

私の routes.rb ファイルには、次の行があります。

  get 'artists/:id(/:slug)', :to => 'artists#show', :as => 'artist'

スラッグが省略されているか、正しくない場合 (アーティスト名によって計算されます)、コントローラ 301 は正しい URL にリダイレクトします。ただし、SEO の理由から、サイト内のすべてのリンクが最初から正しい URL を持っていることを確認したいと考えています。

Artist モデルには、これを機能させるために次の 2 つの (非常に単純な) 関数があります。

  def slug
    name.parameterize
  end

  def to_param
    "#{id}/#{slug}"
  end

アーティスト オブジェクトで呼び出すartist_pathと、これは意図したとおりに機能します。

> app.artist_path(Artist.find 1234)
=> "/artists/1234/artist-name"

ただし、ID だけで call it を使用すると、to_param はまったく使用されないようです。

> app.artist_path(id: 1234)
=> "/artists/1234"

tl;dr: ID のみが指定されている場合でも、 Rails が常にオブジェクトをインスタンス化し、呼び出されたときに呼び出すように強制するにはどうすればよいですか?to_paramartist_path

4

1 に答える 1

2

私が知る限り、あなたが求めていることが機能しない理由は、組み込み/自動 URL ヘルパー (例では ID など) に値を渡すと、それらの値が取得されるためです。ルート URL の「空白を埋める」ために使用されます。

配列を渡すと、URL が入力されるまで配列の値が順番に使用されます。ハッシュを渡すと、それらのプロパティが URL に置き換えられます。モデルのようなオブジェクトは、その to_param メソッドを使用して値を入力します...など。

「そのモデルの制限を知っている」という懸念は理解できますが、この動作は Rails では標準であり、実際に誰かがスローされるとは思いません。例のように ID を渡す場合、URL ヘルパーに「この ID を使用してモデルを介してレコードを検索する」ように指示しているのではなく、単に「指定した ID を含む URL 文字列。」組み込みの URL ヘルパーは、ルート/コントローラー名から推測する以外に、レコードを検索する方法 (使用するモデルなど) さえ知らないと確信しています。

私の最善の提案は、インスタンス化されたモデル/レコードを常に使用することです。URL ヘルパーがそれを調べてくれることを期待していた場合、データベースへのクエリに関する限り、追加のオーバーヘッドはありません。レコードを自分でインスタンス化することを避けたい追加の理由がある場合は、それを聞いて喜んで他の提案を提供します。

于 2012-11-26T19:22:17.297 に答える