А если вместо того, чтобы выдавать ошибки, вы просто используете проверку?Что-то вроде следующего (Просто для начала. Это потребует работы.):
# if you don't cache the tracker in an attribute already, do this so
# you can add errors as if it were a column.
attr_accessor :tracker
def create_events(&block)
tracker = fedex.track(:tracking_number => number)
if tracker.valid?
# ...
else
# add the error with i18n
errors.add(:tracker, :error_type_if_you_know_it)
# or add it from a returned message
errors.add(:tracker, nil, :message => fedex.get_error())
end
end
Затем в вашем контроллере:
@number.track
respond_with(@number) do |format|
if @number.errors.any?
format.html { redirect_to root_path }
else
format.html { render :some_template_with_errors }
end
end
В качестве альтернативы вы могли бы сделать это как часть проверки (таким образом, вызов valid?
будет работать, как и ожидалось, и не уничтожит ваши собственные "отслеживаемые" ошибки)
# do your tracking on creation, if number was given
validate :on => :create do
if number.present?
tracker = fedex.track(:tracking_number => number)
unless tracker.valid?
errors.add :tracker, nil, :message => tracker.get_error()
end
end
end
# then do your actual creation of tracking events sometime after validation
before_save :handle_tracker_assignment
def handle_tracker_assignment
self.assign_tracker(tracker)
# note the block method you're using would need to be reworked
# ...
end
Обратите внимание, что в последнем случае у вас будетнемного изменить свою логику и просто передать номер отслеживания и попытаться сохранить новую запись, что вызовет попытку отслеживания.