marcusM
marcusM

Reputation: 614

Ruby: How do I pass all parameters and blocks received by one method to another?

I am writing a helper that adds an HTML attribute to a link_to tag in rails. So, my thinking is that my helper method should accept any parameters or blocks passed to it, call link_to with those same parameters, add it's attribute to what is returned, and return the result to the caller.

Like this:

def link_to(*args, &block)
  ... rails code in link_to ...
end

def myhelper(*args, &block) # Notice that at this point, 'args' has already
  link_to()                 # become an array of arguments and 'block' has
  ... my code ...           # already been turned into a Proc.
end

myhelper() # Any arguments or blocks I pass with this call should make
           # it all the way through to link_to.

So, as you can see, there seems to be no way (that doesn't involve lots of code and conditional branching) to pass what myhelper has received to link_to without turning all of the parameters back into what they looked like before they got to my method.

Is there a more 'Ruby-like' solution to this problem?

Upvotes: 53

Views: 25796

Answers (2)

Marian13
Marian13

Reputation: 9228

def method(...)

Starting from Ruby 2.7 it is possible to pass all the arguments of the current method to the other method using (...).

So, now,

def my_helper(*args, &block)
  link_to(*args, &block)
  
  # your code
end

can be rewritten as

def my_helper(...)
  link_to(...)

  # your code
end

Here is the link to the feature request.

Upvotes: 30

sepp2k
sepp2k

Reputation: 370102

You can use * and & in method calls to turn arrays back into lists of arguments and procs back into blocks. So you can just do this:

def myhelper(*args, &block)
  link_to(*args, &block)
  # your code
end

Upvotes: 84

Related Questions