Comments 26
плохой пример про presence.
region = params[:state].presence || params[:country].presence || 'US'
ничем не отличается от
region = params[:state] || params[:country] || 'US'
region = params[:state].presence || params[:country].presence || 'US'
ничем не отличается от
region = params[:state] || params[:country] || 'US'
Меня это тоже насторожило. Попытался найти пояснение, зачем нужен presence.
Оказывается, отличие в том, что он проверяет не только равенство nil, но и то, не является ли объект пустым в том или ином смысле.
См. api.rubyonrails.org/classes/Object.html#M000013, комментарий к следующему за ним методу present?(), который вызывается методом presence(), и в особенности api.rubyonrails.org/classes/Object.html#M000011 — rdoc для blank?(), где и описывается логика: «An object is blank if it‘s false, empty, or a whitespace string. For example, "", " ", nil, [], and {} are blank.»
Оказывается, отличие в том, что он проверяет не только равенство nil, но и то, не является ли объект пустым в том или ином смысле.
См. api.rubyonrails.org/classes/Object.html#M000013, комментарий к следующему за ним методу present?(), который вызывается методом presence(), и в особенности api.rubyonrails.org/classes/Object.html#M000011 — rdoc для blank?(), где и описывается логика: «An object is blank if it‘s false, empty, or a whitespace string. For example, "", " ", nil, [], and {} are blank.»
Кажется все после этого идут в rdoc и внимательно читают, зачем нужен этот presence…
Я так понял, что это и есть решение избыточности кода а-ля:
То есть теперь можно писать
a = b if b.present?
То есть теперь можно писать
a = b.presence
или я опять что-то путаю?видимо путаешь) потому что если b не будет, то он вернет nil и a будет равно nil.
Блин, меня достало уже писать так (как выше), особенно если конструкции сложные (и слова длинные). Приходится одно и то же дважды писать: сначала при присвоении, а потом — при проверке. Отстой ;/
ДА ДА ДА. Например @theme.logo = params[:theme][:logo] if params[:theme][:logo]
ну так presence для этого и сделан, разве нет?
@theme.logo = params[:theme][:logo].presence
если есть то поставит лого, если нет то будет nil
@theme.logo = params[:theme][:logo].presence
если есть то поставит лого, если нет то будет nil
А вот и нет. Допустим у вас была какая то запись в базе. Пришли данные из формы в которых поле лого было пустым. Вы сделали @theme.logo = params[:theme][:logo].presence И получилось что у вас затерлось поле лого в базе, которое по идее обновляться не должно было.
Может быть, поможет конструкция «a ||= b»?
Если бы вы писали на чем нибудь другом, а не на Ruby, то не отличалось бы! Смотря конечно что вы ожидали бы получить.
В Ruby все объект, как мы знаем. Пустая строка(массив, хэш) такой же объект как и не пустая поэтому и та и другая преобразовываются в true, во многих других языках не так.
Поэтому нам порой приходится проверять объекты на их «пустоту». Метод blank?
present? = !blank?
В Ruby все объект, как мы знаем. Пустая строка(массив, хэш) такой же объект как и не пустая поэтому и та и другая преобразовываются в true, во многих других языках не так.
Поэтому нам порой приходится проверять объекты на их «пустоту». Метод blank?
present? = !blank?
{}[:something] == nil — вот что я имел ввиду
(nil || nil || 'US') == 'US'
(nil || nil || 'US') == 'US'
Да, я прекрасно понял.
Но вы ведь поняли что
region = params[:state].presence || params[:country].presence || 'US'
отличается от
region = params[:state] || params[:country] || 'US'
Потому что во втором случае params[:x] может быть только nil или false, а в первом может быть и пустым объектом.
Но вы ведь поняли что
region = params[:state].presence || params[:country].presence || 'US'
отличается от
region = params[:state] || params[:country] || 'US'
Потому что во втором случае params[:x] может быть только nil или false, а в первом может быть и пустым объектом.
юху! :)
CanCan тоже очень понравился
Тут еще много по теме вкусного! ruby-toolbox.com/categories/rails_authorization.html
Ребята, ну мы ведь договаривались не писать эти штуки: «Текст подготовлен в редакторе...». Ну что ж вы так?
А за статью спасибо :)
А за статью спасибо :)
После исправления у вас появились номера строк кода. Или они были, просто я их не заметил при первом прочтении? Мне кажется, что их лучше убрать — когда строк всего-то две-три (или даже одна), то они только запутывают.
Sign up to leave a comment.
Обзор новинок в Ruby on Rails