Ruby on rails 使用此控制器/模型设置如何显示错误?
我有一个create方法,它在ping一些第三方api的模型中调用一个方法 我需要做的是,如果API发回某个消息,那么我会显示一个错误 下面是我当前的控制器和模型设置,那么如何将错误返回到控制器(以及最终的视图) 以下是我的控制器中的方法: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
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?
实际上会清除错误并重新验证,这将转储自定义错误。编辑答案。