Ruby:条件会话的简写?

时间:2013-12-27 16:51:19

标签: ruby-on-rails ruby

1。是否有更简单的方法来编写这样的多个条件?

self.location = ""
self.location += geo["city"].to_s + ", " if geo["city"].present?
self.location += geo["regionName"].to_s + ", " if geo["regionName"].present?
self.location += geo["countryName"].to_s + ", " if geo["countryName"].present?

2。并删除任何尾随逗号?

更新 以下是我正在尝试使用Vee解决方案的确切代码

geo = JSON.parse(open('http://www.geoplugin.net/json.gp?ip=127.0.0.1').read)
fields_to_select = ["geoplugin_city", "geoplugin_regionName", "geoplugin_countryName"]
location = geo.select { |elem| fields_to_select.include? elem }.values.compact.join(', ')

3 个答案:

答案 0 :(得分:7)

这应该有效:

self.location = geo.values_at('city', 'regionName', 'countryName').compact.join(', ')
  • values_at返回'city''regionName''countryName'的值(按此顺序)
  • compact删除了nil个值
  • join加入元素,将每个元素转换为字符串

由于您使用的是Rails,因此您可以拨打reject(&:blank?)而不是compact来删除nil值和空字符串。

答案 1 :(得分:4)

答案:加入从过滤后的哈希值生成的数组元素,删除所有blank

self.location = geo.select { |elem| fields_to_select.include? elem }.values.reject(&:blank?).join(',')

原始答案:

fields_to_select = ["city", "regionName", "countryName"]
self.location = geo.select { |elem| fields_to_select.include? elem }.join(',')

更新

如果geo是哈希:

fields_to_select = ["city", "regionName", "countryName"]
self.location = geo.select { |elem| fields_to_select.include? elem }.values.join(',')

并在nil之前删除数组中的所有join元素:

self.location = geo.select { |elem| fields_to_select.include? elem }.values.compact.join(',')   

答案 2 :(得分:1)

您也可以使用hash_keys.map(&hash)

所以,

self.location = %w(city regionName countryName).map(&geo).compact.join(", ")