2010-07-02 6 views
0

У меня возникли проблемы с получением url_for для рендеринга Take to_param при выборе того, какой маршрут использовать.делает url_for использовать to_param при построении маршрута

У меня есть два набора маршрутов, которые используют ту же модель (Foo). Если Foo.is_special, url должен отображаться в/special /: action. Если это не так, оно должно отображаться в /: id /: action. Поскольку это та же модель, я бы хотел, чтобы url_for автоматически узнал, к какому пути привязана карта, в зависимости от is_special.

routes.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 

Это работает, когда я установил: идентификатор в явном виде. Например:

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

Создает правильный URL для специальной, когда: идентификатор набора явно «специальный», и когда @foo is_special == ложь. Однако, когда @ foo.is_special == true, специальный маршрут не распознается.

ответ

1

Не уверен, если это ожидаемое поведение, но это работает:

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

Вместо

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

Да, to_param будет вызываться для перевода @foo в строку. Вы уверены, что его не называют? Может быть, проблема в другом месте. Попробуйте в консоли, чтобы убедиться. Чтобы проверить маршруты в консоли, вы можете сначала ввести

Включить ActionController :: UrlWriter; default_url_options [: хост] = 'локальный: 3000'