2011-09-15 4 views
0

私は配列を持っています@cities = ["Vienna", "Barcelona", "Paris"];Ruby、これよりも条件付き反復を実装する方がいいですか?

そして私は間に​​スペーサーを入れて個々のアイテムを表示しようとしています。しかし、配列内に1つの要素しか存在しない可能性があります。この場合、スペーサーを表示したくありません。また、配列が空の場合もあります。その場合は何も表示しません。上記アレイの場合

私は次のように出力したい:私は実際に都市名を印刷する前などの書式設定、CSSを適用するためにERBテンプレートcityviewを使用

Vienna 
----- 
Barcelona 
----- 
Paris 

を。簡体字、それは次のようになります。

<p><%= @cities[@city_id] %></p> 

次のように私はそれを実装している...

unless @array.empty? 
    @city_id = 0; 

    erb :cityview 
end 

unless @array[1..-1].nil? 
    @array[1..-1].each_index do |i| 
     @city_id = i+1; 

     puts "<p>-------</p>"; 

     erb :cityview 
    end 
end 

がより良い方法はありますか?

+0

これはRubyまたはRuby on Railsの質問ですか? –

答えて

0

私が好む:

ERB:

<p><%= @city %></p> 

とループ

@array.each_with_index do |e, i| 
    @city = e 
    erb :cityview 
    puts "<p>-------</p>" if i < @array.length - 1 
end 

を私はあなたがそれをカスタマイズしたいので、あなたがERB、ビットを分割していると仮定します。

6
@cities.join("<p>--------</p>") 

編集テンプレートに

に対処するために、ここで私はプットを行わずにレンダリングテンプレートを返すerbs方法があることを仮定しています。文字列を返すことで、操作や再利用が容易になります。

@cities.map { |c| @city = c; erb :cityview }.join("<p>--------</p>") 
+3

ちょうど2時間前に私は[これ](http://StackOverflow.Com/questions/7420214/comma-separation-in-a-ruby-loop/7420250#)を書きましたので、私はデジャヴを持っているように感じます。 comment-8973446)を次のように似た質問に置き換えています:「これはRubyの一般的なルールとなり、他の現代の言語とほとんど同じになります。ループを書くと、あなたは間違っていますし、メソッド、高水準イテレータ、コンビネータ、ヘルパーなどを使用する必要があります。" –

+0

「@ cities」にアンパサンドなどのHTMLセーフではないものが含まれていると問題が発生します。 –

+0

@mu非常に簡単に解決できるようです。 –

0

HTMLを都市名と混在させたい場合は、HTMLに混ぜる前にHTMLのエンコードに関することを心配する必要があります。ただ、標準ライブラリの使用:あなたはRailsの中にいるなら

require 'cgi' 
html = @cities.map { |c| CGI.escapeHTML(c) }.join('<p>-----</p>') 

することは、あなたはあなたのビューでエンコーディングを心配することを避けるためにERB::Utilからhtml_escapeを使用しても安全-用-HTML html_safeで結果をマークすることができます:

include ERB::Util 
html = @cities.map { |c| html_escape(c) }.join('<p>-----</p>').html_safe 
関連する問題