用于创建视图的 ruby​​ 助手围绕关联的文字

发布于 2024-11-19 08:18:37 字数 268 浏览 1 评论 0原文

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

关联

“与 foo、bar、baz 和 ## more...” foo、bar , baz 是三个 mobdel b 的名称。如果名称超过 3 个,我不想打印所有名称,因此我想用剩余的关联数来尾随它。

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

谢谢。

I am not sure what this is called, but I have a model a which has_many b. When showing some model a in a view, I would like to print some text describing all the model b associations it has like the following:

"Has an association with foo, bar, baz, and ## more..."

foo, bar, baz are names of three mobdel b's. And I don't want to print all the names if there are more than 3, so I want to trail it off with the balance # of associations remaining.

I can do this programatically in ruby, but I was wondering if some helper methods exists which can do this for me..

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

友欢 2024-11-26 08:18:37

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

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

Version with range checking + optional block to convert items to string:

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

Test run:

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}" }

Output:

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
谎言 2024-11-26 08:18:37

我没有找到一种方法可以轻松做到这一点,并且 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) 

您应该得到您想要的。

I don't see a way to do that easily, and the ruby / rails code to get it is pretty simple. So why not doing a helper method on your own? The signature for your method could be:

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

So by calling (in a HAML way)

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

you should get what you want.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文