我有一个生成Javascript对象的rails模板(.rhtml文件)。它看起来像下面这样:
var volumes = {
<% for volume in @volumes %>
<%= volume.id %> : <%= volume.data %>
<%= ',' unless volume === @volumes.last %>
<% end %>
};
请注意unless
语句修饰符以禁止在最后一个元素之后打印逗号(以满足Internet Explorer,这非常不支持JSON属性声明中的尾随逗号)。
这似乎有效,但作为一种风格问题,人们认为在模板中依靠<%= value unless condition %>
生成适当的render
电话是否合理?
答案 0 :(得分:6)
我不明白为什么不这样做,但通常如果您发现自己在最后一个成员上使用逗号,则可能需要使用join
代替:
<%= @volumes.map {|v| "#{v.id} : #{v.data}"}.join "," %>
答案 1 :(得分:3)
如果您想构建JSON(并且您正在构建JavaScript Object而不是Array),那么我建议使用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 %>;
答案 2 :(得分:0)
甚至:
<%= @volumes.map { |v| "#{v.id} : #{v.data}"}.to_sentence -%>
获得“a:某事,b:其他事情,c:任何事情,d:另一件事。”