Как бы я получил сообщение об ошибке для этой настройки контроллера / модели? - PullRequest
0 голосов
/ 03 октября 2011

У меня есть метод create, который вызывает метод в модели, которая пингует некоторые сторонние API.

Что мне нужно сделать, это если API отправит обратно определенное сообщение, то я бы отобразилошибка.

Ниже приведен мой текущий контроллер и настройка модели, так как мне вернуть ошибку обратно в контроллер (и, в конечном итоге, в представление)?

Вот метод в моем контроллере:

def create
  @number = Number.where(:tracking => params[:number][:tracking], :user_id => current_user.id).first

  if @number.blank?
    @number = Number.new
    @number.tracking = params[:number][:tracking]
    @number.user_id = current_user.id
    @number.notes = params[:number][:notes]
    @number.track
  end

  respond_with(@number) do |format|  
    format.html { redirect_to root_path }  
  end
end

Вот методы в моей модели:

def track
  create_events
end


def create_events(&block)

  tracker = fedex.track(:tracking_number => number)

  if tracker.valid?    
    self.assign_tracker(tracker)

    tracker.events.each do |e|
      self.create_event(e) unless (block_given? && !block.call(e))
    end

    save
  else
    # NEED TO THROW THE ERROR HERE
  end
end

Ответы [ 2 ]

0 голосов
/ 03 октября 2011

А если вместо того, чтобы выдавать ошибки, вы просто используете проверку?Что-то вроде следующего (Просто для начала. Это потребует работы.):

# 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

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

0 голосов
/ 03 октября 2011

Обычно вы должны разгрузить вызовы API для фонового задания, и вы можете использовать средства оповещения (или промежуточное программное обеспечение Rack), чтобы вызывать ошибки, определяемые пользователем, и обрабатывать их соответствующим образом.

...