On Dec 3, 2009, at 6:08 PM, Dave Porter wrote:

> Hi Owen,  Sorry yes this was a bit vague !
>
> This is what is currently in the Cookbook index.dryml for the front
> page
> So the '<preview-with-more name="recent recipes"  
> with="&Recipe.recent"/
>> '
>
> Is the code that is displaying the list of recipes on the front page.
>
> I need to understand how this works ?
>

To start with, you typically want to figure out the context the tag  
ends up running in. Here, the with= attribute is setting the context  
to Recipe.recent (a named scope on Recipe that sorts models in  
descending order by created_at - it's defined in automatic_scopes).  
The recent scope accepts the number of records to limit the source as  
a parameter, or defaults it to 6 (as in this case).

For the rest, track down the source of preview-with-more; you'll find  
it in rapid_plus.dryml (in the hobo plugin). As an aside, a good text  
editor with "Search all files" pointed at the hobo source is pretty  
much a standard tool - heck, it used to *be* the documentation.

Anyway, the source of preview-with-more:

<!-- Captures the common pattern of a list of "the first few" cards,  
along with a link to the rest. -->
<def tag="preview-with-more" attrs="name">
   <% name ||= collection_name.pluralize -%>
   <section class="#{name.gsub(' ', '-').dasherize} preview-with-more"  
param="default">
     <h3 param="heading"><%= name.titleize %></h3>
     <a param="more">More <type-name plural lowercase/>...</a>
     <collection param/>
     <a action="new" if="&can_create?(this.new)" param="new-link">New < 
%= this.member_class.view_hints.model_name %></a>
   </section>
</def>

Most of this should be pretty self-explanatory. The meat of the action  
here is in the collection tag. That's defined over in  
rapid_generics.dryml:

<def tag="collection">
   <ul class="collection #{collection_name :dasherize => true}" merge- 
attrs unless="empty?">
     <li param="item" class="#{scope.even_odd} #{model_id_class}"  
repeat="&select_viewable">
       <do param="default"><card param/></do>
     </li>
   </ul>
   <empty-collection-message param="empty-message"/>
</def>

This creates the actual list of Recipe cards; note that the card tag  
is just a default here, as calling the collection tag like this:

<collection>
   <some-tag />
</collection>

Will repeat some-tag instead of card.

Next you look up where the card for Recipe is defined; in this case,  
it's in app/views/taglibs/application.dryml (in the hobocookbook  
source):

<extend tag="card" for="Recipe">
   <old-card merge without-count>
     <before-heading:><gravatar:user size='50' param/></before-heading:>
     <creator-link: replace><div param="user">By: <a:user/></div></ 
creator-link:>
     <append-body:>
       <div param="timestamp">
         <if test="&this.created_at == this.updated_at">
           <view:created-at.to-date/>
         </if>
         <else>
           Updated: <view:updated-at.to-date/>
         </else>
       </div>
     </append-body:>
   </old-card>
</extend>

Note that this is extending the base card (autogenerated in app/views/ 
taglibs/auto/rapid/cards.dryml):

<def tag="card" for="Recipe">
   <card class="recipe" param="default" merge>
     <header: param>
       <h4 param="heading"><a><name/></a></h4>
     </header:>
     <body: param>
       <a:user param="creator-link"/>
       <ht key="comments.collection.count" count="&this.comments.size">
          <count:comments param/>
       </ht>
     </body:>
   </card>
</def>

With the modifiers in the extended definition, the actual definition  
looks more like:

<def tag="card" for="Recipe">
   <card class="recipe" param="default" merge>
     <gravatar:user size='50' param/>
     <header: param>
       <h4 param="heading"><a><name/></a></h4>
     </header:>
     <body: param>
       <div param="user">By: <a:user/></div>
       <ht key="comments.collection.count" count="&this.comments.size">
          <count:comments param/>
       </ht>
       <div param="timestamp">
         <if test="&this.created_at == this.updated_at">
           <view:created-at.to-date/>
         </if>
         <else>
           Updated: <view:updated-at.to-date/>
         </else>
       </div>
     </body:>
   </card>
</def>

One can follow this rabbit hole for quite a while longer, but I hope  
this helps!

--Matt Jones

--

You received this message because you are subscribed to the Google Groups "Hobo 
Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/hobousers?hl=en.


Reply via email to