2011-09-14 14 views
0

私は、レール3.1とルビ1.9.2を使って広告サーバーを作っています。このアプリでは、広告を表示するjavascriptを生成するlocalhost:3000/ads/scriptのページがあります。私はループでいくつかの助けを探しています。私は、カンマで区切ってのdocument.writeへの動的javascriptの変数を追加しようとしている第二のループでルビ・ループでのカンマ区切り?

<% @ad.each do |ad| %> 

    <% if ad.end_date <= Date.today || ad.start_date >= Date.today %> 

    <% else %> 

    var advert<%= ad.id %> = '' 
    advert<%= ad.id %>+='<img class="ad" alt="<%= ad.title %>" src="http://<%= request.env["HTTP_HOST"] %><%= ad.image.url %>" border="0" height="<%= ad.best_height %>" width="<%= ad.best_width %>" />'; 
    advert<%= ad.id %>+='</a>'; 
    advert<%= ad.id %>+=''; 

    <% end %> 
<% end %>  


document.write(<% @ad.each do |ad|%> 
       <% if ad.end_date <= Date.today || ad.start_date >= Date.today %> 

       <% else %> 
        avert<%= ad.id %>, 
       <% end %> 
      <% end %>);  

:ここ

はscript.html.erbためのコードです。 "document.write(advert1、advert2、advert3)と似ていますが、現在のコードでは、すべての変数の後にコンマが置かれます。後にコンマを入れないようにする必要があります。どのようにこれを達成するためのアイデア?

カンマ区切りの問題とは別に、すべてが機能しますが、非常に乾燥していないようで、if else文を実行するより良い方法があるようです...これは私の最初のルビーアプリですリファクタリングは非常に高く評価されます。

ありがとうございます!

+1

を広告モデルで適切なメソッドを呼び出すことで、コントローラの「現在」の広告を除外する必要があります。それはあなたの意見をもっときれいにします。 –

+0

ラースに感謝、まだこのすべてに新鮮です。だから、私の日付基準にフィルタをかけるAdモデルのメソッドを作成してから、コントローラの中で@ ad.some_methodのような何かをすることです。 – changinglanes

答えて

3

使用すると、参加:

@ad.select{|ad| !(ad.end_date <= Date.today || ad.start_date >= Date.today)}.collect{|ad| "avert#{ad.id}" }.join(",") 
+0

私にそれを打つ:) –

+0

まさに私が必要な、感謝! – changinglanes

+0

これは、Rubyと他の現代の言語のほとんどの一般的なルールになっています。ループを書くと、間違っていることがありますし、高次メソッド、高レベルイテレータ、コンビネータ、ヘルパーなどの代わりに使用する必要があります。 –

関連する問題