url_for использует to_param при построении маршрута - PullRequest
0 голосов
/ 02 июля 2010

У меня проблемы с получением 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

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

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

Генерирует правильный URL для special, когда: id явно установлен на 'special', а когда @foo is_special == false. Однако когда @ foo.is_special == true, специальный маршрут не распознается.

Ответы [ 2 ]

1 голос
/ 05 июля 2010

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

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

Вместо

map.special 'special/:action', :controller => 'bar', :id => 'special'
0 голосов
/ 02 июля 2010

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

include ActionController :: UrlWriter;default_url_options [: host] = 'localhost: 3000'

...