ruby-on-rails - Ruby:如何迭代散列并根据项目数量做一些不同的事情?

标签 ruby-on-rails ruby

我正在使用看起来像这样的散列:

h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}

但是,它可能只有一个项目:

h = { 
    "side2"=>["verde", "Verde"]
}

我想输出散列,使其看起来像这样:

User changed side1 from green to Green and side2 from verde to Verde

当有两个项目时,将用“和”分隔。否则它看起来像这样:

User changed side2 from verde to Verde

这一切都发生在我的 Rails View 脚本中。如何编写代码才能执行此操作?

最佳答案

你可以这样做:

h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ')
# "side1 from green to Green and side2 from verde to Verde"

h = { 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ')
# side2 from verde to Verde"

因此,在 ERB View 中:

User changed <%= h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ') %>.

如果您经常做这类事情,那么您可能想为它构建一个帮助器。

你也可以使用 to_sentence因为你在 Rails 中:

User changed <%= h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.to_sentence %>.

to_sentence 方法也可以更好地扩展到两个以上的元素。所以,如果你还有 "side3"=>["pancakes", "Pancakes"],那么你会得到:

User changed side1 from green to Green, side2 from verde to Verde, and side3 from pancakes  to Pancakes.

关于ruby-on-rails - Ruby:如何迭代散列并根据项目数量做一些不同的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6965141/

相关文章:

ruby-on-rails - bin/rails 生成模型 文章标题 :string text:text

ruby-on-rails - 如何将页码添加到 PDFKit 生成的 PDF?

ruby-on-rails - rails : undefined method `*' for nil:NilClass

ruby - 在 (Mac)Vim 中查看 ri 时摆脱 ANSI 转义字符

ruby-on-rails - 使用 rvm 和 git 部署 Capistrano [git 发布失败]

ruby-on-rails - Paranoia Gem - 加入已删除的项目

html - Rails 错误消息破坏注册表单

ruby-on-rails - 使用 Ruby on Rails 设计 - 强制用户在首次登录时更改密码

具有整数键的 Ruby Hash 更改为字符串键

ruby-on-rails - Rails 在连接表中创建多条记录