【问题标题】:Rails Model method check if field nil, if so return empty stringRails Model方法检查字段是否为零,如果是则返回空字符串
【发布时间】:2015-06-20 00:46:01
【问题描述】:

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

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。如果地址1,地址2,地址3都为空,如何更改方法?

我想我正在寻找这样的功能:

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

【问题讨论】:

标签: ruby-on-rails ruby


【解决方案1】:

您可以使用present? 来检查 nil 而不会引发错误(对于 nil 和空字符串或其中只有空格的字符串,它返回 false)。

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

    address_lines = [self.address1,self.address2,self.address3].select(&:present?).join(',')

这不会为空白或 nil 地址返回一个空字符串 - 它只会将它们排除在 address_lines 之外。

注意 present? 与 chad_ 建议的 blank? 相反。我认为任何一个都可以帮助您获得所需的结果。

此博客的体面总结:http://railsless.blogspot.com/2011/08/difference-between-nil-empty-blank.html

【讨论】:

    【解决方案2】:

    尽管这可能不是您想要的,但您可以使用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
    

    【讨论】:

    • 感谢这是一个非常简洁的解决方案
    【解决方案3】:

    在rails中,你可以检查foo.blank?,它会检查nil? || empty

    【讨论】:

    • 它是由Object#blank? 声明的,所以它适用于任何东西。还有,空白?是一个只检查对象是否响应空的衬管吗?并调用它,如果它在那里,否则它返回 true,除非 self 存在。基本上关键是在 nil 上调用它来确定它是否为 nil...
    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    相关资源
    最近更新 更多