2008-11-07 22 views
2

我有一個生成Javascript對象的rails模板(.rhtml文件)。它看起來像下面這樣:在Rails模板中使用條件語句修飾符

var volumes = { 
    <% for volume in @volumes %> 
    <%= volume.id %> : <%= volume.data %> 
    <%= ',' unless volume === @volumes.last %> 
    <% end %> 
}; 

注意unless語句修飾打壓最後一個元素之後打印逗號(,以滿足Internet Explorer中,它居然不支持尾隨逗號JSON性能聲明)。

這似乎工作,但作爲一種風格問題,人們是否認爲在模板中依靠<%= value unless condition %>生成適當的render調用是合理的?

回答

6

我不明白爲什麼不能,但是總的來說,如果你發現自己的最後一個部件上conditionalizing一個逗號,你可能想使用join代替:

<%= @volumes.map {|v| "#{v.id} : #{v.data}"}.join "," %> 
0

甚至:

<%= @volumes.map { |v| "#{v.id} : #{v.data}"}.to_sentence -%> 

爲了得到「a:某事,b:其他事情,c:任何事情,而d:另一件事情。」

+0

不是在JavaScript中究竟合法的,但是,嘿,不管你變成上。 – 2008-11-07 20:33:38

+0

該死的吉姆。你過來我家,吃我自制的排骨,然後你公開指出我甚至沒有讀過這個問題,並注意到「var volumes = ......」下一步,偷走我的小狗? – 2008-11-08 02:12:50

3

如果你想去構造JSON(和BTW你正在構建JavaScript對象不是數組),那麼我建議使用to_json方法:

var volumes = <%= @volumes.inject({}){|h,v| h.merge(v.id=>v.data)}.to_json %>; 

var volumes = <%= Hash[*@volumes.map{|v| [v.id, v.data]}.flatten].to_json %>; 

更妙的是將Ruby Hash構建移到模型中,因爲它太複雜以至於無法查看。

class Volume 
    def self.to_hash(volumes) 
    Hash[*volumes.map{|v| [v.id, v.data]}.flatten] 
    end 
end 

,然後在視圖中,可以把很多簡單的代碼:

var volumes = <%= Volume.to_hash(@volumes).to_json %>;