是否可以覆盖Rails路径助手方法?

时间:2011-12-08 15:43:13

标签: ruby-on-rails routing

当前详细的铁路路径助手

我经常编写代码来获取以下网址:

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在控制台中访问这些帮助程序。我如何从控制台访问我的新助手方法?

2 个答案:

答案 0 :(得分:7)

是的,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

答案 1 :(得分:1)

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

他们进入app/helpers

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