【问题标题】:Is it possible to override Rails path helper methods? [duplicate]是否可以覆盖 Rails 路径辅助方法? [复制]
【发布时间】:2011-12-08 15:43:13
【问题描述】:

当前详细的 Rails 路径助手

我一直在编写代码来获取如下 URL:

link_to @applicant.name, company_job_applicant_path(@company, @job, @applicant)

不过,这段代码看起来更像这样(冗余)部分:

link_to @applicant.name, company_job_applicant_path(@applicant.job.company, @applicant.job, @applicant)

这很愚蠢。

必需的“pert”路径助手

其他参数显然可以从@job 派生出来。我真正需要输入的是:

link_to @applicant.name, applicant_quick_path @applicant

在某处有以下定义:

def applicant_quick_path applicant
    company_job_applicant_path(applicant.job.company, applicant.job, applicant)
end

我的问题

  1. 这是一个合理的Rails Way做事吗
  2. 我应该将这个方法存储在哪里?
  3. 我目前可以使用app.company_path 在控制台中访问这些帮助程序。如何从控制台访问我的新辅助方法?

【问题讨论】:

  • 标记为重复的问题确实相似,但是这个问题是分开的,因为它的答案有link_to查看助手的细节,另一个是路由和路径,呈现建议的解决方案的细节不同且影响搜索能力。

标签: ruby-on-rails routing


【解决方案1】:

是的,DRY 是做事的“Rails 方式”。如果你一遍又一遍地重复这个方法,那么为它创建一个视图助手是有意义的。我不会修改路径助手,而是简单地包装 rails link_to 方法。

你可以像这样快速简单地做一些事情:

# app/helpers/application_helper.rb
def link_to_applicant(applicant)
  link_to applicant.name, company_job_applicant_path(applicant.job.company, applicant.job, applicant)
end

# link_to(@applicant)
#=> <a href="/companies/jobs/applicants/123">Peter Nixey</a>

或者,您可以为link_to 方法提供一些额外的支持

def link_to_applicant(applicant, html_options={})
  link_to applicant.name, company_job_applicant_path(applicant.job.company, applicant.job, applicant), html_options
end

# link_to_applicant(@applicant, :id=>"applicant-#{@applicant.id}")
#=> <a id="applicant-123" href="companies/jobs/applicants/123">Peter Nixey</a>

如果您想完全支持link_to 提供的所有功能,您可以在此处查看它们如何允许多个函数签名

# rails link_to source code
def link_to(*args, &block)
  if block_given?
    options      = args.first || {}
    html_options = args.second
    link_to(capture(&block), options, html_options)
  else
    name         = args[0]
    options      = args[1] || {}
    html_options = args[2]

    html_options = convert_options_to_data_attributes(options, html_options)
    url = url_for(options)

    href = html_options['href']
    tag_options = tag_options(html_options)

    href_attr = "href=\"#{html_escape(url)}\"" unless href
    "<a #{href_attr}#{tag_options}>#{html_escape(name || url)}</a>".html_safe
  end
end

RSpec 说明

如果您想在 RSpec 中为您的视图助手编写测试,请遵循以下指南: https://www.relishapp.com/rspec/rspec-rails/docs/helper-specs/helper-spec

【讨论】:

  • 我实际上需要这样做是出于更复杂的原因(请参阅stackoverflow.com/questions/8424682/…)。您的回答非常有帮助,但考虑到这一点,我想知道随后如何在 rspec 测试中访问这些助手,例如测试时,response.should redirect_to company_path(@company)?我不能使用原来的长助手,因为实际上有逻辑将存储在我的助手中......
  • 我用一些 RSpec 注释更新了答案
  • 您好 Macek,感谢您提供帮助测试参考。我想知道的不是如何测试助手,而是如何通过其他方法(例如something.should redirect_to my_helper_method(@company))实际访问它们 - 谢谢!
  • 另请注意,这种方式(在帮助程序中)您将无法在控制器中使用它。如果你想要这个,你必须将该方法移动到应用程序控制器并通过helper_method :link_to_applicant 将其声明为帮助程序。然后它将在控制器和视图中都可用。
【解决方案2】:

您正在描述一个非常典型的 Rails 助手。

他们进入app/helpers

默认情况下,该目录将有一个 ApplicationHelper 模块,或者如果您想以不同方式组织它们,您可以添加自己的模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多