ped*_*rom 16 ruby ruby-on-rails
我有以下代码:
url = file.s3_url.blank? ? file.url : file.s3_url
Run Code Online (Sandbox Code Playgroud)
有没有更短的方式来写这个?
谢谢!
Jac*_*kin 20
好吧,你可以在任何file实例上写一个方法(比如说S3File):
class S3File
def real_url
self.s3_url.blank? ? self.url : self.s3_url
end
#...
end
Run Code Online (Sandbox Code Playgroud)
然后它变得非常简单:
url = file.real_url
Run Code Online (Sandbox Code Playgroud)
正如@tokland所说,你可以Object使用一个or_if方法来修补补丁,这将实现如下:
class Object
def or_if(method, val = nil)
self.send(method) ? (block_given? ? yield : val) : self
end
end
Run Code Online (Sandbox Code Playgroud)
这样,您就可以这样做:
url = file.s3_url.or_if(:blank?) { file.url }
Run Code Online (Sandbox Code Playgroud)
或这个:
url = file.s3_url.or_if(:blank?, file.url)
Run Code Online (Sandbox Code Playgroud)
tok*_*and 19
在ActiveSupport,Object#presence中有一个抽象:
url = file.s3_url.presence || file.url
Run Code Online (Sandbox Code Playgroud)
也许,你可以做到以下几点:
url = file.s3_url || file.url
Run Code Online (Sandbox Code Playgroud)
如果file.s3_url为nil,则此代码仅使用file.url.这意味着空字符串不起作用.如果您想确保不使用空字符串,就像您在示例中所做的那样,那么执行此操作的方法并不短.