Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to override Rails path helper methods? [duplicate]

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

  1. Is this a reasonable Rails Way to do things
  2. Where should I store this method?
  3. I can currently access these helpers in the console using app.company_path. How would I access my new helper methods from the console?
like image 300
Peter Nixey Avatar asked Dec 08 '11 15:12

Peter Nixey


1 Answers

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

RSpec notes

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

like image 176
maček Avatar answered Oct 27 '22 06:10

maček