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.