ruby helpers用于在关联周围创建视图文本

时间:2011-07-10 17:12:22

标签: ruby-on-rails ruby views helpers

我不确定这叫什么,但我有一个模型a has_many b。当在视图中显示某个模型a时,我想打印一些描述所有模型b关联的文本,如下所示:

“与foo,bar,baz和##更有关联......”

foo,bar,baz是三个mobdel b的名字。如果超过3个,我不想打印所有的名字,所以我想用剩余的协会余额来追踪它。

我可以在ruby中以编程方式执行此操作,但我想知道是否存在一些可以为我执行此操作的辅助方法..

感谢。

2 个答案:

答案 0 :(得分:0)

我没有看到一种方法可以轻松地做到这一点,并且获得它的ruby / rails代码非常简单。那么为什么不自己做一个辅助方法呢?您方法的签名可以是:

def truncate_models(models, numbers)
  models[0..numbers-1].map{|m| m.name}.join(", ") + "and #{models.size - numbers} more..."
end

所以通过调用(以HAML方式)

.models
  Has an association with
  = truncate_models(models, 3) 

你应该得到你想要的东西。

答案 1 :(得分:0)

带范围检查的版本+用于将项目转换为字符串的可选块:

def enumerate_as_text(seq, max, &block)
  text = seq.first(max).map { |itm|
    block_given? ? yield(itm) : itm.to_s
  }.join(", ")
  text += ", and #{seq.length - max} more" if max < seq.length
  text
end

试运行:

blob = %w{a b c d e f g h i j}

puts blob.length
puts blob.join(", ")
puts enumerate_as_text(blob, 1)
puts enumerate_as_text(blob, 4)
puts enumerate_as_text(blob, 9)
puts enumerate_as_text(blob, 10)
puts enumerate_as_text(blob, 11)
puts enumerate_as_text(blob, 20) { |itm| "itm: #{itm}" }

输出:

10
a, b, c, d, e, f, g, h, i, j
a, and 9 more
a, b, c, d, and 6 more
a, b, c, d, e, f, g, h, i, and 1 more
a, b, c, d, e, f, g, h, i, j
a, b, c, d, e, f, g, h, i, j
itm: a, itm: b, itm: c, itm: d, itm: e, itm: f, itm: g, itm: h, itm: i, itm: j