Rails模型方法检查字段是否为nil,如果是则返回空字符串

时间:2015-06-20 00:46:02

标签: ruby-on-rails ruby

在我的模型课中,我有一个方法:

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确实可以使用第二行,也需要一行。它现在的工作将摆脱这一点。

3 个答案:

答案 0 :(得分:2)

您可以使用present?检查nil而不会抛出错误(对于nil和空字符串或仅包含空格的字符串,它返回false)。

因此,您可以使用rejectempty?,而不是selectpresent?

    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