Как я могу иметь значение по умолчанию, если подставляемое значение для gsub равно нулю? - PullRequest
1 голос
/ 09 июня 2011

У меня в настоящее время есть один из многих в длинной строке gsubs:

gsub("{Company}", contact.company_name.clear_company.to_s).

Но иногда contact.company_name имеет значение null.

Так что я выделил из длинной строки что-товот так:

subject.gsub("{Company}", contact.company_name.clear_company.to_s) unless contact.company_name.blank?

Но это выглядит некрасиво и громоздко.Поскольку вот как выглядит вся строка, каждая из них может быть потенциально нулевой, что приведет к ошибке:

12     sub_message =
 13       message.gsub("{FirstName}", contact.first_name).
 14            gsub("{LastName}", contact.last_name).
 15            gsub("{Title}", contact.title || "blank").
 16        #    gsub("{Company}", contact.company_name.clear_company).
 17            gsub("{Colleagues}", colleagues.to_sentence).
 18            gsub("{NextWeek}", next_week.strftime("%A, %B %d")).
 19            gsub("{FollowingWeek}", (Date.today + 14.days).strftime("%A, %B %d")).
 20            gsub("{UserFirstName}", contact.user.first_name).
 21            gsub("{UserLastName}", contact.user.last_name).
 22            gsub("{City}", contact.address.city.titleize || "default city").
 23            gsub("{State}", contact.address.state || "default state").
 24            gsub("{Zip}", contact.address.zip || "default zip" ).
 25            gsub("{Street1}", contact.address.street1.titleize || "default street").
 26            gsub("{Today}", (Date.today).strftime("%A, %B %d")).
 27            gsub("{CustomField1}", contact.custom_field_1.to_s).
 28            gsub("{PageBreak}", "p{page-break-after: always}. ")

Я бы хотел сделать что-то вроде этого

gsub("{Company}", contact.company_name.clear_company.to_s || "").

Ноэто не похоже на работу.Идеи?

Ответы [ 3 ]

3 голосов
/ 09 июня 2011

Самый чистый способ - использовать функцию шаблонов строк в Ruby 1.9.2, и вы можете вообще избежать gsub.

"%{company}" % {:company => contact.company_name.clear_company || ""}
0 голосов
/ 19 июня 2011

Я сохраняю свой другой ответ, потому что это простой ответ для 1.9.2.

В вашем случае я бы отделил замены от метода замены, который вы можете поместить в помощник длядержите ваши взгляды в чистоте.

Замены могут быть установлены в хэше:

replacements = {
  "{Company}" => contact.company_name.clear_company || "",
  "{FirstName}" => contact.first_name,
  "{LastName}" => contact.last_name,
  "{Title}" => contact.title || "blank",
}

Тогда вспомогательный метод будет выглядеть примерно так:

def replace(string, replacements = {})
  replacements.each do |k,v|
    string.gsub!(k,v)
  end
  string
end

Ичтобы использовать его, вы просто должны сделать следующее:

<%= replace("message", replacements) %>

Другое преимущество этой стратегии заключается в том, что при обновлении до 1.9.2 замены близки к форме, которую можно использовать в шаблоне строки

Если ваши потребности сложнее, чем вы опубликовали, я бы подумал об использовании шаблонизатора liquid для обработки ваших замен.

0 голосов
/ 09 июня 2011

Причина, по которой это не работает, заключается в том, что вы приводите его к String.Даже если это ноль, вы, по сути, затем вызываете nil.to_s, который возвращает "" (пустая строка), а оператор || становится бесполезным.

ruby-1.9.2-p136 :004 > "" || 1
 => "" 
ruby-1.9.2-p136 :005 > nil.to_s || 1
 => "" 

Теперь, конечно, если подставить значение по умолчаниюзначение оказывается пустой строкой, тогда это должно работать нормально.

Я бы написал функцию для использования в качестве второго аргумента в вашем gsub вызове.

def d(s)
  s.blank? ? $DEFAULT : s
end

# Call it like this,
$DEFAULT = "default_sub"
gsub("{Company}", d contact.company_name.clear_company)
...