Noob Understanding Collections


#1

Okay, I’ve had some success rendering partials and felt I’d try
something more interesting with collections.

I have a query run by my model, which works. When I run it from the
console I can see all of the data I want. However, bringing that
into my view isn’t working the way I think. So obviously I’m
thinking wrong, but I can’t see where my error is. This usually
means I’m looking in the wrong place, so if someone can help point me
in the right direction I would appreciate it.

In my layout I have:

<%= render(:partial => “articles/synopsis”, :locals => { :synopsis =>
@article }, :collection => @article ) %>

Now if I understand correctly, that’s going to render the partial
“_synopsis.rhtml” from the articles view. Because the collection
uses a variable name based on the template, I’m setting that variable
to equal the variable coming from the current controller using
“:locals”.

In the template for the partial I have:

<%=h synopsis[:article][:title] %>

Which should print out the title of the article. The data is from a
relational query across two tables, so I think I need to specify the
table “:article” and the value I want from the array “:title” however
when I run that I get:

Symbol as array index

Looking at the other partials I’ve done, I thought maybe I shouldn’t
have “:title” as a symbol, so I changed my template to this:

<%=h synopsis[:article.title] %>

But that gives me a different error:

undefined method `title’ for :article:Symbol

If I use <%=debug(synopsis) %> in my template I can see all of the
data. So it seems obvious to me the data is there, I’m just not
accessing it correctly.

I know other people have to be doing this type of thing every day,
blindfolded and in their sleep. :wink: Some guidance on the error of
my ways would be appreciated.

Thanks!
Bill


#2

On Mon, 2006-03-20 at 10:50 -0700, Bill Wilcox wrote:

In my layout I have:
In the template for the partial I have:

<%=h synopsis[:article][:title] %>

Which should print out the title of the article. The data is from a
relational query across two tables, so I think I need to specify the
table “:article” and the value I want from the array “:title” however
when I run that I get:

Symbol as array index


I think that is telling you that you are using [:article] symbol as an
array index but it is not.

Craig


#3

On Mar 20, 2006, at 10:50 AM, Bill Wilcox wrote:

I know other people have to be doing this type of thing every day,
blindfolded and in their sleep. :wink: Some guidance on the error of
my ways would be appreciated.

It may be bad form to reply to oneself, but I guess I need
confirmation that I’m thinking correctly now.

When I used “:local” to assign the values of “@article” to
“synopsis”, did I effectively “flatten” my query results into an
array instead of keeping them in a hash?

So when I then tried to access those values using the hash id, it
gave me an error.

I redid my partial to exclude the “local” object, so it now looks
like this:

<%= render(:partial => “articles/synopsis”, :collection => @article ) %>

Now in my template I can use the following and it works exactly as I
would expect:

<%=h synopsis.title %>

<%=h synopsis.teaser %>

<%=h synopsis.category.name %>

The API doc is a little confusing to me though.

"Two controllers can share a set of partials and render them like this:

<%= render :partial => “advertisement/ad”, :locals => { :ad =>
@advertisement } %>

This will render the partial “advertisement/_ad.rhtml” regardless of
which controller this is being called from. "

If I code the way I read that, it doesn’t work. So I think my
understanding of the above is where my flaw is.

In what case would I want to use “:locals” to assign a variable to
the local variable?

Thanks!
Bill