Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用此控制器/模型设置如何显示错误?_Ruby On Rails_Ruby On Rails 3_Model View Controller_Error Handling - Fatal编程技术网

Ruby on rails 使用此控制器/模型设置如何显示错误?

Ruby on rails 使用此控制器/模型设置如何显示错误?,ruby-on-rails,ruby-on-rails-3,model-view-controller,error-handling,Ruby On Rails,Ruby On Rails 3,Model View Controller,Error Handling,我有一个create方法,它在ping一些第三方api的模型中调用一个方法 我需要做的是,如果API发回某个消息,那么我会显示一个错误 下面是我当前的控制器和模型设置,那么如何将错误返回到控制器(以及最终的视图) 以下是我的控制器中的方法: def create @number = Number.where(:tracking => params[:number][:tracking], :user_id => current_user.id).first if @numb

我有一个create方法,它在ping一些第三方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
@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
以下是我的模型中的方法:

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

通常,您应该将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
@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?
将按预期工作,不会破坏您的自定义“跟踪”错误)


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

@number.valid?
在控制器中返回
true
时,模型中的
tracker.valid?
返回false。很抱歉,是的,调用
valid?
实际上会清除错误并重新验证,这将转储自定义错误。编辑答案。