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(', ')
答案 0 :(得分:7)
这应该有效:
self.location = geo.values_at('city', 'regionName', 'countryName').compact.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(", ")