【问题标题】:Rails: link_to only if route existsRails:仅当路由存在时才链接到
【发布时间】:2015-11-28 22:54:40
【问题描述】:

我正在编写一个 Rails 引擎,在我的一个观点中,如果存在命名路由,我想创建一个指向 main_app 的链接。

我将举一个例子来澄清这个问题: 主应用程序可能会或可能不会在 routes.rb 中定义:

resources :my_resource, only: :index

只有在 main_app 定义了该路由时,我才需要在我的 rails 引擎中添加指向 my_resource_path 的链接。我认为应该是这样的:

<%= link_to "Link", main_app.my_path if my_resource_path_exists? %>

我试过了:

<%= link_to "Link", main_app.my_resource_path if 
      main_app.respond_to?(:my_resource_path) %>

但是,当路径不存在时,会引发 NoMethodError:

undefined method `my_resource_path' for #<Module>

my_resource_path_如何存在?方法可以实现吗?我正在使用 ruby​​ 2.2 和 rails 4.2

问题涉及到:Determine if path exists as route in Rails controller 但是在这种情况下,我有一个命名路由(my_resource_path),所以我需要一些稍微不同的东西,但我自己无法弄清楚。

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

我找到了一个不需要从失败中恢复的解决方案。可以使用 url_helpers 检查路由是否定义:

Rails.application.routes.url_helpers.method_defined?(:my_path)

所以,代码可以这样写:

<%= link_to "Link", main_app.my_resource_path if 
      Rails.application.routes.url_helpers.method_defined?(:my_resource_path) %>

【讨论】:

  • 我喜欢用Rails.application.routes.url_helpers.respond_to?(:what_i_want_to_check_path)
  • 这可以处理格式,所以它只在 html 存在而不是 json 或 csv 等时通过?
【解决方案2】:

您可以使用 main_app.try(:my_path) 或救援 NoMethodError 来返回 false。

【讨论】:

  • 问题是:如何检查路径是否已定义?我正在编写一个可安装的引擎,如果 main_app 愿意,我想选择添加一个指向 main_app 的链接。
  • try 将尝试调用 :my_path,如何使用它来检查路由是否已定义?从失败中拯救是可能的,但我将不得不编写辅助方法。我发现我可以使用:Rails.application.routes.url_helpers.method_defined? :my_path
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 2014-03-22
相关资源
最近更新 更多