0

使用するルートを選択するときに、url_forをレンダリングしてto_paramを考慮に入れるのに問題があります。

同じモデル(Foo)を使用する2セットのルートがあります。Foo.is_specialの場合、URLは/ special /:actionにマップする必要があります。そうでない場合は、/:id /:actionにマップする必要があります。同じモデルなので、is_specialに応じて、どのパスにマップするかをurl_forに自動的に知らせたいと思います。

ルート.rb:

map.special 'special/:action', :controller => 'bar', :id => 'special'
map.regular ':id/:action', :controller => 'bar', :id => /\d+/

foo.rb:

def to_param
   is_special ? 'special' : id.to_s
end

これは、:idを明示的に設定すると機能します。例えば:

url_for(:controller => 'bar', :id => 'special')
url_for(:controller => 'bar', :id => @foo)

:idが明示的に'special'に設定されている場合、および@foo is_special == falseの場合、specialの正しいURLを生成します。ただし、@ foo.is_special == trueの場合、特別なルートは認識されません。

4

2 に答える 2

1

これが期待される動作であるかどうかはわかりませんが、これは機能します。

map.special ':id/:action', :controller => 'bar', :id => 'special'

それ以外の

map.special 'special/:action', :controller => 'bar', :id => 'special'
于 2010-07-05T19:17:58.700 に答える
0

はい、to_paramは@fooを文字列に変換するために呼び出されます。呼び出されていませんか?多分問題はどこかにあります。コンソールで試して確認してください。コンソールでルートをテストするには、最初に次のように入力します

ActionController::UrlWriterを含める; default_url_options [:host] ='localhost:3000'

于 2010-07-02T09:23:06.637 に答える