【问题标题】:Rails: Determine if an object has a named routeRails:确定对象是否具有命名路由
【发布时间】:2012-06-19 08:13:37
【问题描述】:

在 Rails 3.1 应用程序中,我想列出一堆我事先不知道的变量类对象(来自多态表)。对于那些具有命名路由的资源,我想在link_to 调用中使用该路由。不检查是否存在这样的路线的幼稚方法(请原谅 HAML):

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

如果对象是没有命名路由的类Foo 的实例(例如,因为它没有被定义为资源),这将引发undefined method 'foo_path' 错误。是否有一种简单的方法(例如简单的方法调用)来确定对象或类的命名路由是否存在?

编辑:

我想得到的是这样的:

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

【问题讨论】:

  • 您能解释一下为什么要为该对象创建命名路由吗? url_for 输出所有对象的通用 URL 是因为它们共享一个共同的基本类型还是您发布的代码有什么问题?
  • 它们不一定共享一个共同的基本类型。如果命名路由不存在,我不想创建它 - 我只想检查它是否存在。
  • 是的,但根据我的经验,如果存在路由,url_for 只会为任何给定的模型对象生成正确的 url。或者您有没有要过滤的路由的模型对象?

标签: ruby-on-rails ruby-on-rails-3 routing inflection


【解决方案1】:

如果您不希望生成没有命名路由的模型对象或为它们输出一些错误消息,您可以在 link_to 调用中添加救援

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

希望这会有所帮助。

【讨论】:

  • 谢谢。我试图完全避免这种情况,因为对应用程序逻辑使用异常并不理想。在我的情况下,没有命名路由的对象不是例外,而是预期的行为。但我想我可能不得不求助于这个。
  • 一开始我也为此苦苦挣扎..但有时最好不要想太多:)只要事情不会失控复杂性明智..(我也非常谨慎因为 .NET 中的异常是一项非常昂贵的操作,而在 Ruby 中它们似乎快如闪电)
【解决方案2】:

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

respond_to?(object.class.name.underscore + "_path")

这需要根据嵌套、子域和 STI 进行修改;例如,为了我的目的,我有:

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

这似乎工作得很好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2012-08-04
    • 2021-12-24
    • 1970-01-01
    • 2018-03-15
    • 2017-11-15
    相关资源
    最近更新 更多