在我的模型课中,我有一个方法:
def full_address
address_lines = [self.address1,self.address2,self.address3].reject!(&:empty?).join(',')
fulladdress = address_lines + ", " + self.city + ', ' + self.state + ', ' + self.zipcode
return fulladdress
end
这是返回所有地址字段以便快速查看的简单方法。
当它为空时返回undefined method 'empty?' for nil:NilClass
。如果所有address1,address2,address3都为空,如何更改方法?
我想我正在寻找像以下这样的功能:
ReturnBlankIfNilElseValue(self.address1)
这样的东西存在吗?
def full_address
address_lines = [self.address1.to_s,self.address2.to_s,self.address3.to_s].reject!(&:empty?).join(',')
fulladdress = address_lines + ", " + self.city + ', ' + self.state + ', ' + self.zipcode
return fulladdress
end
此变体返回no implicit conversion of nil into String
这是奇怪的,因为在rails控制台中我可以键入nil.to_s
并获得一个空字符串。
我真的不想检查每个字段是否为nil然后添加到数组中,我更喜欢一个只返回空字符串的函数,如果它是nil。
很抱歉,nil.to_s确实可以使用第二行,也需要一行。它现在的工作将摆脱这一点。
答案 0 :(得分:2)
您可以使用present?
检查nil而不会抛出错误(对于nil和空字符串或仅包含空格的字符串,它返回false)。
因此,您可以使用reject
和empty?
,而不是select
和present?
。
address_lines = [self.address1,self.address2,self.address3].select(&:present?).join(',')
这不会为空格或零地址返回一个空字符串 - 它会将它们从address_lines中删除。
注意present?
与chad_建议的blank?
相反。我想任何一个都可以帮助你获得所需的结果。
此博客上的体面摘要:http://railsless.blogspot.com/2011/08/difference-between-nil-empty-blank.html
答案 1 :(得分:1)
在rails中,您可以查看foo.blank?
,它会检查nil? || empty
答案 2 :(得分:1)
您可以,虽然这可能不是您想要的,但只需使用the #compact
method从地址数组中删除所有nil
个对象,以便#empty?
可以正常工作......:
def full_address
[self.address1, self.address2, self.address3,
self.city, self.state, self.zipcode].compact.reject!(&:empty?).join(', ')
end
如果存在某些字段,您应该知道这将返回部分地址。
我可能会使任何故障地址无效(在本例中我只需要第一个地址行和城市字段):
def full_address
return "" unless self.address1 && self.city && !self.address1.empty? && !self.city.empty?
[self.address1, self.address2, self.address3,
self.city, self.state, self.zipcode].compact.reject!(&:empty?).join(', ')
end
无视我对代码所做的一些编辑,我可能会与@ Joseph #present?
一起进行验证,因为您正在使用Rails:
def full_address
return "" unless self.address1 && self.city && self.address1.present? && self.city.present?
[self.address1, self.address2, self.address3,
self.city, self.state, self.zipcode].reject!(&:present?).join(', ')
end