ruby-on-rails - 在此 Controller /模型设置中如何显示错误?

标签 ruby-on-rails ruby-on-rails-3 model-view-controller error-handling

我有一个create方法,该方法在ping某些第三方API的模型中调用一个方法。

我需要做的是,如果API发送回一定的消息,那么我会显示一个错误。

下面是我当前的 Controller 和模型设置,那么如何将错误重新输入到 Controller (最终是 View )中?

这是我的 Controller 中的方法:

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

最佳答案

如果只使用验证而不是抛出错误呢?类似于以下内容(只需开始即可。这需要工作。):

# 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

然后在您的 Controller 中:
@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

请注意,在后一种情况下,您必须稍微更改逻辑,只需传递跟踪编号并尝试保存新记录,这将触发跟踪尝试。

关于ruby-on-rails - 在此 Controller /模型设置中如何显示错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7630747/

相关文章:

ruby-on-rails - Rails 教程 : before_filter deprecated

ruby-on-rails - 尝试从纬度/经度创建点的 RGeo 错误

ruby-on-rails - Rails - 这是保存模型更新的更好方法

java - Spring MVC 奇怪的行为

ruby-on-rails - 优化 ruby​​ on rails 查询

ruby-on-rails-3 - 为什么 where 查询在 postgresql 中不起作用?

ruby-on-rails - 搜索如何使用 rails3 设置 mongo_mapper、设计、haml 的指南

ruby-on-rails - 列出目录和所有子目录中的文件

objective-c - 用户输入如何适应 Apple 的 MVC 模式?

ios - Objective-C : Turning off music after switching views