Рубин сокращение для «используйте это, если оно не пустое, в противном случае используйте это» - PullRequest
15 голосов
/ 14 февраля 2011

У меня есть следующий код:

url = file.s3_url.blank? ? file.url : file.s3_url

Есть ли более короткий способ написать это?

Спасибо!

Ответы [ 5 ]

20 голосов
/ 14 февраля 2011

Ну, вы можете написать метод на любом file экземпляре (скажем, S3File):

class S3File 
   def real_url
     self.s3_url.blank? ? self.url : self.s3_url
   end
   #...
end

Тогда все становится очень просто:

url = file.real_url 

Как сказал @tokland, вы могли бы monkey patch Object использовать метод or_if, который будет реализован следующим образом:

class Object
   def or_if(method, val = nil)
      self.send(method) ? (block_given? ? yield : val) : self
   end         
end

Таким образом, вы сможете сделать это:

url = file.s3_url.or_if(:blank?) { file.url }

Или это:

url = file.s3_url.or_if(:blank?, file.url)
18 голосов
/ 14 февраля 2011

Для этого в ActiveSupport есть абстракция: Объект # присутствие :

url = file.s3_url.presence || file.url
9 голосов
/ 14 февраля 2011

Может быть, вы можете сделать следующее:

url = file.s3_url || file.url

Этот код будет использовать file.url, только если file.s3_url равен nil. Это означает, что пустая строка не будет работать, хотя. Если вы хотите убедиться, что пустая строка не используется, как вы делаете в своем примере, то нет более короткого способа сделать это.

2 голосов
/ 14 февраля 2011

Я использую служебный метод.

def until_not_blank(*args)
  args.find {|a| !a.blank? }
end

url = until_not_blank(file.s3_url, file.url)

Обычно я просто помещаю это в мой ApplicationController и делаю его помощником.Если вы хотите, чтобы он был доступен в глобальном масштабе, вы можете поместить его в Kernel, или вы можете сделать аппликацию Array

class Array
  def first_not_blank
    find {|a| !a.blank?}
  end
end

url = [file.s3_url, file.url].first_not_blank
.
0 голосов
/ 14 февраля 2011

url = (file.s3_url.blank? && file.s3_url) || file.url
Выглядит круто, но я на самом деле нахожу это запутанным и предпочитаю старый добрый троичный, если.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...