Как мои обратные вызовы Rails before_validation должны обрабатывать неверные данные? - PullRequest
2 голосов
/ 30 сентября 2011

У меня есть несколько обратных вызовов before_validation, которые работают с атрибутами, установленными в моей модели. Я сталкиваюсь с неприятностями, когда у меня такая ситуация:

class Foo < ActiveRecord::Base

  before_validation :capitalize_title
  validates :title, :presence => true

  def capitalize_title
    title.upcase
  end

end

Я пишу тест, чтобы убедиться, что заголовок 'nil' не разрешен, но тест выдает ошибку, потому что nil.upcase не определен. Я хотел бы обработать эту ошибку, но у меня уже есть обработка ошибок, которая выполняется после обратных вызовов before_validation.

Я не хочу проверять все мои обратные вызовы before_validation, чтобы убедиться, что данные существуют, если я могу их избежать.

Есть ли чистый или общепринятый способ справиться с такой ситуацией?

1 Ответ

6 голосов
/ 30 сентября 2011

Просто проверьте, есть ли у вас заголовок. И не забудьте сохранить измененный заголовок.

def capitalize_title
  title = title.upcase if title
end

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

before_validation :mangle_data
validate :data_is_okay

#...

def mangle_data
    return if(!data_is_mangleable)
    #... mangle away
end

def date_is_okay
    if(!data_is_mangleable)
        # complain
    end
    if(!data_is_properly_mangled)
        # complain some more
    end
end

def data_is_mangleable
   return false if(thing.nil?)
   # etc.
end

def data_is_properly_mangled
   # check that stuff that the before_validation hook doesn't
   # have to care about.
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...