根据响应代码更改操作respond_to

时间:2012-06-10 03:53:51

标签: ruby-on-rails

我有以下create行动:

def create

  @report = Report.new(params[:report])
  @file = params[:report][:data_file]


  res = @report.get_report(@file, @report.year, @report.month)

  file = open('report.pdf','wb')
  file.write(res.body)

  @report.file = file

  respond_to do |format|
    if @report.save
      format.html { redirect_to @report, notice: 'Report was successfully created.' }
      format.json { render json: @report, status: :created, location: @report }
    else
      format.html { render action: "new" }
      format.json { render json: @report.errors, status: :unprocessable_entity }
    end
  end

end

但是,res变量中存储的HTTP响应可能包含200代码或400代码,表示错误请求。我希望如果res.code为400,它还会返回new操作并显示警告消息。

我尝试在respond_to上包含这个条件,如果如下,但它没有奏效。似乎在创建实例后,它会重定向到edit操作。这毫无意义。

  respond_to do |format|
    if @report.save and res.code == 200
      format.html { redirect_to @report, notice: 'Report was successfully created.' }
      format.json { render json: @report, status: :created, location: @report }
    else
      format.html { render action: "new" }
      format.json { render json: @report.errors, status: :unprocessable_entity }
    end
  end

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

这是一个复杂的工作流程,但看起来如果res的状态是400,你只想重新渲染新的表单。所以你可以使用下面的方法尽早逃脱:

  if res.status != 200
    render :new
    return
  end
  respond_to do |format|
    if @report.save
      format.html { redirect_to @report, notice: 'Report was successfully created.' }
      format.json { render json: @report, status: :created, location: @report }
    else
      format.html { render action: "new" }
      format.json { render json: @report.errors, status: :unprocessable_entity }
    end
  end