2015-06-20 16 views
0

在我的模型类我有一个方法:Rails的模型方法检查,如果场零,如果是的话返回空字符串

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这是奇怪的,因为在轨控制台我可以输入nil.to_s,并得到一个空字符串。

我真的不想检查每个字段是否为零,然后添加到数组,我宁愿一个函数,只是返回空字符串,如果它是零。

对不起,nil.to_s不工作其第二行,需要一个以及。它的工作现在将摆脱这一点。

+0

可能重复(HTTP:// stackoverflow.com/questions/247948/is-there-a-better-way-of-checking-nil-or-length-0-一串红宝石) – Elyasin

+0

我不认为是重复的。如果没有检查它是否为零,我想返回空白。 –

+0

你必须检查零,才能返回空白。你还会怎么做? – Elyasin

回答

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 

不顾我对代码所做的一些修改,我可能会与去@约瑟夫的#present?连同验证,因为你用Rails:?是否有检查Ruby中的String的无或长度== 0更好的办法]

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 
+0

感谢这是一个简洁的解决方案 –

1

在轨,您可以检查foo.blank?,它会检查nil? || empty

+0

不是零对象,还是我错了? – Elyasin

+0

它由[Object#blank?](http://api.rubyonrails.org/classes/Object.html#method-i-blank-3F)声明,所以它适用于任何事情。 另外,空白?是一个单线程,只是检查对象是否响应为空?并呼吁如果它在那里,否则它将返回true,除非存在self。基本上,关键是要叫它为零,以确定它是否为零... –

2

您可以使用present?检查零而不发出一个错误(它的零和空字符串,或者在短短空格的字符串返回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

相关问题