Current verbose rails path helpers
I'm constantly writing code to get URLs like:
link_to @applicant.name, company_job_applicant_path(@company, @job, @applicant)
However this code looks more like this (redundant) piece:
link_to @applicant.name, company_job_applicant_path(@applicant.job.company, @applicant.job, @applicant)
This is silly.
Required 'pert' path helpers
The other parameters can clearly be derived from the @job. All I should really need to type is:
link_to @applicant.name, applicant_quick_path @applicant
where there is a definition somewhere of:
def applicant_quick_path applicant
company_job_applicant_path(applicant.job.company, applicant.job, applicant)
end
My questions
Rails Way
to do thingsapp.company_path
. How would I access my new helper methods from the console?Yes, DRY is the "Rails way" to do things. If you're repeating this method over and over again, it makes sense to create a view helper for it. Instead of modifying the path helpers, I'd simply wrap rails link_to
method.
You can do something quick and easy like this:
# 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>
Alternatively, you can roll in some extra support for the link_to
method
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>
If you want to fully support all the features provided by link_to
, you can see how they permit for multiple function signatures here
# 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
If you'd like to write tests for your view helpers in RSpec, follow this guide: https://www.relishapp.com/rspec/rspec-rails/docs/helper-specs/helper-spec
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With