2011-11-08 3 views
0

は、私はこのようなブロックがあるとしましょう:Rubyの各ブロックでは、ブロック内の配列の最後のレコードに何かしますか?

<% @help_sections.each do |section| %> 
    <li><%= section.name %></li> 
<% end %> 

しかし、最後のレコードが返され、私は例えば、他の何かをしたいのありますliにクラスを適用する:

<li class="last"><%= section.name %></li>

私が最もDRYな方法であることはどのように行うのですか?

ありがとうございました。

EDIT1:

私は単にブロック内でそれを行う方法がわからif声明とlastルビーメソッドを使用しますが、ない想像?私はその配列の最後の要素がほしいと思ったら、私はちょうど@help_sections.lastを行うことができますが、それはRubyブロックの範囲内で意味をなさないことを知っています。

答えて

7

ほとんどのDRY方法は、代わりにCSSを使用することです。例えばこの:

li.last { color: red; } 

..and余分なCSSクラスを使用してマークアップを乱雑に、ちょうど:last-child pseudoselectorを使用し、すなわち:

li:last-child { color: red; } 

次に、あなたがあなたのビューで何かを変更する必要はありません。これは、IE9を含む最新のブラウザーすべてでサポートされています。

+0

唯一の問題を除いて、すべての主要なブラウザで ':last'と':last-child'疑似クラスがサポートされていますか?私はこの提案が好きです。 – marcamillion

+0

@Jordan @ marcamillion最後の 'li'のスタイリングについて問題があったなら、これは完璧な答えでした。しかし、問題は、 'each'イテレータを使って解析される配列の最後のレコードで特別なことをすることです。少なくとも、これは質問のタイトルと、最後の 'li 'の' li'と 'class'が例として与えられたという事実から理解しているところです(' .... .... '参照) –

+0

これを見てください参照:http://reference.sitepoint.com/css/pseudoclass-lastchildおよびhttp://www.quirksmode.org/css/contents.html。 ':last-child'はIEを除くすべての主要なブラウザでサポートされています(最大9バージョン) – WarHog

1

平文eachの代わりにeach_with_indexを使用すると、ブロックにはコレクション内の現在の要素のインデックスも渡されます。それを@help_sections.lengthと比較することができます。

など。

<% @help_sections.each_with_index do |section, i| %> 
    <li<% concat " class='last'" if i == @help_sections.length - 1 %>><%= section.name %></li> 
<% end %> 
+0

'each_with_index'はレールで利用できますか?なぜなら、それはルビーコアではないからです。 –

+1

http://www.ruby-doc.org/core-1.9.3/Enumerable.html#method-i-each_with_index – tokland

+0

CSSソリューションは、 1つ...しかし...私は持っている別の問題(同様の性質の)のための解決策を持っているかもしれないと思いますか? - http://stackoverflow.com/questions/8044038/how-do-i-detect-if-a-link-has-been-clicked-and-apply-a-different-css-class-if-it – marcamillion

1

あなたは

<% @help_sections.count.times do |i| %> 
    <%= @help_sections[i].name %> 
    <%= do_something if @help_sections.count == i - 1 %> 
<% end %> 
+0

CSSソリューションは、私がこの中で欲しいものの中で最もエレガントです...しかし...私は持っている別の問題(同様の性質のもの)の解決策を持っていると思いますか? - http://stackoverflow.com/questions/8044038/how-do-i-detect-if-a-link-has-been-clicked-and-apply-a-different-css-class-if-it – marcamillion

1

この古い答えは役立つかもしれない(Tell the end of a .each loop in ruby)のような何かを行うことができますどちらか。基本的に、あなたが使用することができます。

<% @help_sections.each_with_index do |section, index| %> 
    <% if index == @help_sections.size - 1 %> 
    <li class="last"> 
    <% else %> 
    <li> 
    <% end %> 

    <%= section.name %></li> 
<% end %> 
+0

Iこれについて考えましたが、ループの複雑さが増しているように思えます。つまり、サイクルごとに配列自体をもう一度調べていると、配列サイズが大きい場合はパフォーマンスが低下する可能性があります。 – marcamillion

+0

それほど遅くはないようです。私は配列 '['Random'、 'titles'、 'stuffs']'が1000回繰り返された配列の1.9.1でクイックベンチマークを行い、 '.size - 1'のチェックで0.0001秒遅くなりましたそれなしでよりも。 – William

+0

CSSソリューションは、私がこの中で欲しいものの中で最もエレガントです...しかし、あなたは(私と同じような性質の)別の問題の解決策を持っていると思いますか? - http://stackoverflow.com/questions/8044038/how-do-i-detect-if-a-link-has-been-clicked-and-apply-a-different-css-class-if-it – marcamillion

2

each_with_indexを試してみてください:スマートCSSセレクタでカバーされていない一般的なケースでは

<% @help_sections.each do |section, index| %> 
    <li <%= "class='last'" if index == (@help_sections.length-1) %>><%= section.name %></li> 
<% end %> 
+0

CSSソリューションは、私がこの中で欲しいものの中で最もエレガントです...しかし...私は持っている別の問題(同様の性質のもの)の解決策を持っていると思いますか? - http://stackoverflow.com/questions/8044038/how-do-i-detect-if-a-link-has-been-clicked-and-apply-a-different-css-class-if-it – marcamillion

1

、あなたはそのコンテキストで各反復要素を提供する便利なヘルパーメソッドを定義することができますコレクション内でこのような:その後、

def each_with_context enum 
    length = enum.count 
    enum.each_with_index do |elem, i| 
    context = { 
     :first => i == 0, 
     :last => i == length - 1, 
     :even => i.even?, 
     :odd => i.odd?, 
     :middle => i == length/2 
    } 
    yield elem, context 
    end 
end 

そしてHAML以内にそれを使用して、次のように表示します。

-each_with_context(@help_sections) do |section, context| 
    %li{:class => context[:last] ? 'last' : nil} 
    =section.name 
+0

ありがとうこれは...この特定の問題のためのBITの過剰なようだが、私はこれが私が持っている別の問題に適切かもしれないと思う:http://stackoverflow.com/questions/8044038/how-do-i-detect -if-a-link-has-been-click-and-a-different-css-class-if-it それに刺すように気をつけてください。 – marcamillion

+0

あなたはそれを1か所だけで使用するのは残念ですが、私は同意します。しかし、それはかなり一般的ですし、私はそれがあなたのアプリケーションのヘルパーに入れて、平均的なWebアプリケーションでここやそこに役立つことができると思います。 –

1

DRYは、一般的には良いアイデアですが、李の繰り返しから保つために自分を殺すことはありません。

<% @help_sections[0...-1].each do |section| %> 
    <li><%= section.name %></li> 
<% end %> 
<li class="last"><%= @help_sections.last.name %></li> 
関連する問題