Ruby:如何迭代哈希并根据项目数量做一些不同的事情?

And*_*rew 2 ruby ruby-on-rails

我正在使用看起来像这样的哈希:

h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}
Run Code Online (Sandbox Code Playgroud)

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

h = { 
    "side2"=>["verde", "Verde"]
}
Run Code Online (Sandbox Code Playgroud)

我想输出哈希,使它看起来像这样:

用户将side1从绿色更改为绿色,将 side2从verde更改为Verde

当有两个项目将与"和"分开.否则它将如下所示:

用户将ver2改为verde

这一切都发生在我的rails视图脚本中.如何编写代码才能执行此操作?

mu *_*ort 5

你可以这样做:

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"
Run Code Online (Sandbox Code Playgroud)

因此,在ERB视图中:

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

如果你做了很多这样的事情,那么你可能想为它构建一个帮助器.

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

User changed <%= h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.to_sentence %>.
Run Code Online (Sandbox Code Playgroud)

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

User changed side1 from green to Green, side2 from verde to Verde, and side3 from pancakes  to Pancakes.
Run Code Online (Sandbox Code Playgroud)