在Rails模板中使用条件语句修饰符

时间:2008-11-07 18:03:14

标签: ruby-on-rails ruby

我有一个生成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电话是否合理?

3 个答案:

答案 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:另一件事。”