Forum: Ruby on Rails Noob Understanding Collections

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Bill Wilcox (Guest)
on 2006-03-20 19:52
(Received via mailing list)
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.  ;-)  Some guidance on the error of
my ways would be appreciated.

Thanks!
Bill
Craig W. (Guest)
on 2006-03-20 21:21
(Received via mailing list)
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
Bill Wilcox (Guest)
on 2006-03-20 22:05
(Received via mailing list)
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.  ;-)  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 %><br>
<%=h synopsis.teaser %><br>
<%=h synopsis.category.name %><br>

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
This topic is locked and can not be replied to.