当前详细的铁路路径助手
我经常编写代码来获取以下网址:
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
我的问题
Rails Way
做事app.company_path
在控制台中访问这些帮助程序。我如何从控制台访问我的新助手方法?答案 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中为视图助手编写测试,请按照以下指南操作: https://www.relishapp.com/rspec/rspec-rails/docs/helper-specs/helper-spec
答案 1 :(得分:1)
您正在描述一个非常典型的Rails助手。
他们进入app/helpers
。
默认情况下,该目录将包含ApplicationHelper
模块,或者如果您想以不同方式组织它们,则可以添加自己的模块。