Rails: определите, есть ли у объекта именованный маршрут
В приложении на Rails 3.1 я хочу перечислить группу объектов переменного класса (из полиморфной таблицы), которые я не знаю заранее. Для тех, которые являются ресурсами с именованным маршрутом, я хотел бы использовать этот маршрут в link_to
вызов. Наивный подход без проверки, существует ли такой маршрут (извините, HAML):
%ul
- @objects.each do |object|
%li= link_to object, url_for(object)
Это поднимет undefined method 'foo_path'
ошибка, если объект является экземпляром класса Foo
который не имеет именованного маршрута (например, потому что он не определен как ресурс). Есть ли простой способ (например, простой вызов метода), чтобы определить существование именованного маршрута для объекта или класса?
РЕДАКТИРОВАТЬ:
Я хотел бы получить что-то вроде этого:
%ul
- @objects.each do |object|
%li= link_to_if object.has_route?, object, url_for(object)
2 ответа
Вы можете просто добавить спасение к вашему вызову link_to, если вы не хотите, чтобы создавались объекты модели без именованных маршрутов, или выводить для них какое-то сообщение об ошибке.
%ul
- @objects.each do |object|
%li= (link_to(object, url_for(object)) rescue "no link")
Надеюсь это поможет.
Глядя на точно такую же проблему. Я не люблю спасение по той же причине. я думаю
respond_to?(object.class.name.underscore + "_path")
Это должно быть изменено в зависимости от вложенности, поддоменов и STI; например, для моей цели у меня есть:
respond_to?("ops_media_file_#{asset.class.base_class.name.underscore}_path")
и это, кажется, работает очень хорошо.