Forum: Ruby on Rails Cache on certain condition

E46593732261d73ee99adc380b7f767a?d=identicon&s=25 Greg Ma (gregorylepacha)
on 2010-10-19 23:00
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
5f94b9b346c2aa648a80bc259978e5bc?d=identicon&s=25 Colin Law (Guest)
on 2010-10-19 23:15
(Received via mailing list)
On 19 October 2010 22:00, Greg Ma <lists@ruby-forum.com> 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
1566d4066e11205ec3e3aaeeaf89348b?d=identicon&s=25 Luke Cowell (lcowell)
on 2010-10-20 04:05
(Received via mailing list)
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
5f94b9b346c2aa648a80bc259978e5bc?d=identicon&s=25 Colin Law (Guest)
on 2010-10-20 09:46
(Received via mailing list)
On 20 October 2010 03:03, Luke Cowell <lcowell@gmail.com> wrote:
>  <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
1566d4066e11205ec3e3aaeeaf89348b?d=identicon&s=25 Luke Cowell (lcowell)
on 2010-10-20 16:51
(Received via mailing list)
Hi Colin, can you please explain ?

Luke
5f94b9b346c2aa648a80bc259978e5bc?d=identicon&s=25 Colin Law (Guest)
on 2010-10-20 17:39
(Received via mailing list)
On 20 October 2010 15:49, Luke Cowell <lcowell@gmail.com> 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
1566d4066e11205ec3e3aaeeaf89348b?d=identicon&s=25 Luke Cowell (lcowell)
on 2010-10-20 23:54
(Received via mailing list)
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
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.