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 %>
  <p class="title"><%= job.title %></p>
  <p class="location"><%= job.location%></p>
  <p><%= distance_of_time_in_words(DateTime.now, job.published_at)
%></p>
<% else %>
  <% cache job %>
    <p class="title"><%= job.title %></p>
    <p class="location"><%= job.location %></p>
    <p><%= job.published_at %></p>
  <% end %>
<% end %>

Greg

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?

<p class="title"><%= job.title %></p>
<p class="location"><%= job.location%></p>
<p><%= distance_of_time_in_words(DateTime.now, job.published_at)
%></p>
<% else %>
<% cache job %>
<p class="title"><%= job.title %></p>
<p class="location"><%= job.location %></p>
<p><%= job.published_at %></p>
<% end %>
<% 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
   <p class="title"><%= job.title %></p>
   <p class="location"><%= job.location %></p>
   <p><%= job.published_at %></p>

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

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
<p class="title"><%= job.title %></p>
<p class="location"><%= job.location %></p>
<p><%= job.published_at %></p>

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

Colin

Hi Colin, can you please explain ?

Luke

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

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
  <p class="title"><%= job.title %></p>
  <p class="location"><%= job.location %></p>
  <p><%= job_time(job) %></p>
  <p><%= job.published_at %></p>

#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