Ruby on rails Rails:确定对象是否具有命名路由

Ruby on rails Rails:确定对象是否具有命名路由,ruby-on-rails,ruby-on-rails-3,routing,inflection,Ruby On Rails,Ruby On Rails 3,Routing,Inflection,在Rails3.1应用程序中,我想列出一组可变类的对象(来自多态表),这些对象我事先不知道。对于那些具有命名路由的资源,我希望在link_to调用中使用该路由。未检查是否存在此类路线的天真方法(请原谅HAML): 如果对象是类foo的实例,而该类没有命名路由(例如,因为它没有定义为资源),则这将引发未定义方法“foo\u path”错误。是否有一种简单的方法(例如简单的方法调用)来确定对象或类的命名路由的存在 编辑: 我想得到的是这样的东西: %ul - @objects.each do |ob

在Rails3.1应用程序中,我想列出一组可变类的对象(来自多态表),这些对象我事先不知道。对于那些具有命名路由的资源,我希望在
link_to
调用中使用该路由。未检查是否存在此类路线的天真方法(请原谅HAML):

如果对象是类
foo
的实例,而该类没有命名路由(例如,因为它没有定义为资源),则这将引发
未定义方法“foo\u path”错误。是否有一种简单的方法(例如简单的方法调用)来确定对象或类的命名路由的存在

编辑:

我想得到的是这样的东西:

%ul
- @objects.each do |object|
  %li= link_to_if object.has_route?, object, url_for(object)

如果不希望生成没有命名路由的模型对象或为它们输出一些错误消息,则可以向要调用的链接添加一个rescue

%ul
- @objects.each do |object|
  %li= (link_to(object, url_for(object)) rescue "no link")

希望这能有所帮助。

看看同样的问题。出于同样的原因,我不喜欢救援。我在想

respond_to?(object.class.name.underscore + "_path")
这需要根据嵌套、子域和STI进行修改;e、 g.就我的目的而言,我有:

respond_to?("ops_media_file_#{asset.class.base_class.name.underscore}_path")

这似乎很有效。

您能解释一下为什么要为该对象创建命名路由吗?url_是否用于输出所有对象的通用url,因为它们共享一个公共基类型,或者您发布的代码有什么问题?它们不一定共享一个公共基类型。如果命名路由不存在,我不想创建它-我只想检查它是否存在。是的,但根据我的经验,如果存在路由,url\u for将为任何给定的模型对象生成正确的url。或者您是否有没有要筛选的没有管线的模型对象?谢谢。我正试图避免这种情况,因为对应用程序逻辑使用异常并不理想。在我的例子中,没有命名路由的对象不是例外,而是预期的行为。但我想我可能不得不求助于此。我在一开始也为此而挣扎。。但有时最好不要想得太多:)只要事情不失控。。(我也非常谨慎,因为.NET中的异常是一个非常昂贵的操作,而Ruby中的异常似乎非常快)
respond_to?("ops_media_file_#{asset.class.base_class.name.underscore}_path")