Question about a multiple assignment statement used in Rails

Z

zenshade

As I'm very much still a ruby newbie, I'm hoping someone can help me to
correctly parse the following statement generated by Rails scaffolding:

@category_pages, @categories = paginate :category, :per_page => 10

This statement occurs in the following context:

class CategoriesController < ApplicationController
..
..
..
def list
@category_pages, @categories = paginate :category, :per_page => 10
end
..
..
..
end

Now, I know that paginate is a method of the ActionController class,
but is it being called with two arguments or one? And if it is being
called with two arguments :)category, :per_page => 10), how is
multi-assignment working here?

To me, this looks like @category_pages will get the return value of the
paginate method, and @categories will be assigned the value nil.

Any advice on how to correctly understand this assignment statement
would be greatly appreciated.
 
J

Jan Svitok

As I'm very much still a ruby newbie, I'm hoping someone can help me to
correctly parse the following statement generated by Rails scaffolding:

@category_pages, @categories = paginate :category, :per_page => 10

This statement occurs in the following context:

class CategoriesController < ApplicationController
.
.
.
def list
@category_pages, @categories = paginate :category, :per_page => 10
end
.
.
.
end

Now, I know that paginate is a method of the ActionController class,
but is it being called with two arguments or one? And if it is being
called with two arguments :)category, :per_page => 10), how is
multi-assignment working here?

To me, this looks like @category_pages will get the return value of the
paginate method, and @categories will be assigned the value nil.

Any advice on how to correctly understand this assignment statement
would be greatly appreciated.

let's simplify it:

var1, var2 = fnc :sym1, :sym2 => 10

1. the right-hand side: function's arguments are divided in two
groups: non-hash and hash. all the hash args are passed as one hash,
as last argument (also there can be a special argument &block, that
will take the block if any was passed).
So the call is equivalent to: fnc:)sym1, {:sym2 =>10})

2, now the left-hand side: if fnc returns an array (what I suppose is
the case), the array can be automatically split into items:

a, b = [1,2] #=> a == 1, b == 2

So that's it.
 
Z

zenshade

Jan said:
a, b = [1,2] => a == 1, b == 2

So that's it.


Ah, I see. The method returns an object with multiple values that get
unpacked by the multi-assignment.

That's very cool, but a bit obtuse. I think I can learn to like it,
though ;).

Thanks
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,230
Members
46,819
Latest member
masterdaster

Latest Threads

Top