73

I have a method in a rails helper file like this

def table_for(collection, *args)
 options = args.extract_options!
 ...
end

and I want to be able to call this method like this

args = [:name, :description, :start_date, :end_date]
table_for(@things, args)

so that I can dynamically pass in the arguments based on a form commit. I can't rewrite the method, because I use it in too many places, how else can I do this?

3 Answers 3

101

Ruby handles multiple arguments well.

Here is a pretty good example.

def table_for(collection, *args)
  p collection: collection, args: args
end

table_for("one")
#=> {:collection=>"one", :args=>[]}

table_for("one", "two")
#=> {:collection=>"one", :args=>["two"]}

table_for "one", "two", "three"
#=> {:collection=>"one", :args=>["two", "three"]}

table_for("one", "two", "three")
#=> {:collection=>"one", :args=>["two", "three"]}

table_for("one", ["two", "three"])
#=> {:collection=>"one", :args=>[["two", "three"]]}

(Output cut and pasted from irb)

Sign up to request clarification or add additional context in comments.

1 Comment

There is a very similar example in Programming Ruby, Thomas & Hunt, 2001 with a bit more explanation. See chapter "More About Methods", section "Variable-Length Argument Lists".
69

Just call it this way:

table_for(@things, *args)

The splat (*) operator will do the job, without having to modify the method.

1 Comment

I was trying to compose parameters for a fixed method from an array and your answer helped thanks e.g.; method(*['a', '', nil].compact_blank)
0
class Hello
  $i=0
  def read(*test)
    $tmp=test.length
    $tmp=$tmp-1
    while($i<=$tmp)
      puts "welcome #{test[$i]}"
      $i=$i+1
    end
  end
end

p Hello.new.read('johny','vasu','shukkoor')
# => welcome johny
# => welcome vasu
# => welcome shukkoor

3 Comments

Could you also add an explanation?
first of all, create a pointer test,which is like an array,then, find the array length. then we have to iterate the loop till the counter reaches the length.then in loop it will print the welcome message with all the arguements in method
i is defined here as global variable. it will be set to zero only once, when class is loaded. so second run of read function will never work.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.