Cache on certain condition

Hi,

I want to cache objects only if they were published at least 5 days ago.
He is the code I’ve done, but I don’t like because it is not dry…
How could I improve it?

<% if job.published_at < 5.days.from_now %>

<%= job.title %>

<%= job.location%>

<%= distance_of_time_in_words(DateTime.now, job.published_at) %>

<% else %> <% cache job %>

<%= job.title %>

<%= job.location %>

<%= job.published_at %>

<% end %> <% end %>

Greg

On 19 October 2010 22:00, Greg Ma [email protected] wrote:

Hi,

I want to cache objects only if they were published at least 5 days ago.
He is the code I’ve done, but I don’t like because it is not dry…
How could I improve it?

<% if job.published_at < 5.days.from_now %>

Is that not testing for before 5 days in the future rather than 5 days
ago?

<% end %>
In terms of DRYness you could perform the test and cache or otherwise
and set a variable to the text for published_at, then output the
title, location and pre-determined text. Still not very pretty
though.

Colin

How about something like this:
<% if job.published_at > 5.days.ago %> #credit to Colin for catching
this
<%= render :partial => “job” %>
<% else %>
<% cache job %>
<%= render :partial => “job” %>
<% end %>
<% end %>

_job.html.erb

<%= job.title %>

<%= job.location %>

<%= job.published_at %>

I’d also look at turning the logic on that first line into a method

def recently_published?
job.published_at > 5.days.ago
end

Luke

On 20 October 2010 03:03, Luke C. [email protected] wrote:

<%= job.title %>

<%= job.location %>

<%= job.published_at %>

I think that does not provide the required alternative versions for
display of published_at.

Colin

On 20 October 2010 15:49, Luke C. [email protected] wrote:

Hi Colin, can you please explain ?

In the OPs original post he has two ways of rendering job.published_at.
For the case where it is recent
<%= distance_of_time_in_words(DateTime.now, job.published_at) %>
and otherwise just
<%= job.published_at %>

Colin

Hi Colin, can you please explain ?

Luke

If you make the requirement to be always cached or never cached then I
see us having more options.

#the partial can worry about how to render itself; keep the main view
clean.
<%= render :partial => “job” %>

_job.html.erb – you could optionally wrap this in in a cache block

<%= job.title %>

<%= job.location %>

<%= job_time(job) %>

<%= job.published_at %>

#job_helper.rb
def job_time(job)
if job.published_at > 5.days.ago
distance_of_time_in_words(DateTime.now, job.published_at)
else
job.published_at
end
end

Luke