Forum: Ruby on Rails cycle(...) - is there some sort of only_first_time(...)?

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Fc582698581884352e745d1d4c64699d?d=identicon&s=25 Joshua Muheim (josh)
on 2009-04-19 23:51
Hi all

The cycle() method is very handy in views. But is there some sort of
only_first_time() that returns the passed value only the first time it
is invoked within a view?

Thanks for help :-)
Josh
Ef3aa7f7e577ea8cd620462724ddf73b?d=identicon&s=25 Rob Biedenharn (Guest)
on 2009-04-20 00:50
(Received via mailing list)
On Apr 19, 2009, at 5:51 PM, Joshua Muheim wrote:

>
> Hi all
>
> The cycle() method is very handy in views. But is there some sort of
> only_first_time() that returns the passed value only the first time it
> is invoked within a view?
>
> Thanks for help :-)
> Josh
> --

Just write one:

in a helper:
   def only_first_time(what)
     first_time = @previous_what.nil?
     @previous_what ||= what
     what if first_time
   end

in a view:
<ol>
   <% 5.times do |i| -%>
     <li>say <%= only_first_time('once') %></li>
   <% end -%>
</ol>

the resulting HTML:
<ol>
  <li>say once</li>
  <li>say </li>
  <li>say </li>
  <li>say </li>
  <li>say </li>
  </ol>

-Rob
Rob Biedenharn    http://agileconsultingllc.com
Rob@AgileConsultingLLC.com
Fc582698581884352e745d1d4c64699d?d=identicon&s=25 Joshua Muheim (josh)
on 2009-04-20 00:52
> Just write one:
>
> in a helper:
>    def only_first_time(what)
>      first_time = @previous_what.nil?
>      @previous_what ||= what
>      what if first_time
>    end

Thanks, but that's not very versatile. I could only use it once. AFAIK I
can use cycle() wherever I want, so I'd like the helper to be somehow
dependant from where it has been called. Is this possible?

Thanks
3be29bee1806b097fc68621eb45f2e37?d=identicon&s=25 Ryan Waldron (rew)
on 2009-04-20 02:28
(Received via mailing list)
It might be instructive to look at the code for the cycle method.  It
actually creates an object and calls its to_s method each time you call
'cycle'.

You could do a similar thing.  Create a small class with a 'to_s' method
that returns something the first time, but nothing thereafter.

class Once
  def initialize(first_value)
    @value = first_value
  end

  def reset
    @value = ''
  end

  def to_s
    value = @value
    reset
    return value
  end
end

Stick that in lib/ or include it some other way. Then you can call
cycle,
but pass your object as a single argument to cycle (cycle doesn't
require
actually more than one param, though you could pass your object as both
params, or just pass it as the first param and '' as the second):

<% label_once = Once.new('_bar') %>

  <tr class='foo<%= cycle(label_once) %>'>

You'll get

  <tr class='foo_bar'>
  ...
  <tr class='foo'>
  ...
  <tr class='foo'>

Might be a bit overkill, but kind of fun. :)

On Sun, Apr 19, 2009 at 5:52 PM, Joshua Muheim <
F999a7c806afd4b1d53f9fed9a18c704?d=identicon&s=25 Jason Arora (Guest)
on 2009-04-20 21:04
(Received via mailing list)
I would prefer to use each_with_index:

@records.each_with_index do |r, i|
  "first record: #{r.name}" if i == 0
  "just another record: #{r.name}"
end
This topic is locked and can not be replied to.