0

我有以下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带有警告消息的操作。

如果如下所示,我尝试在 response_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

正确的方法是什么?

4

1 回答 1

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
于 2012-06-10T04:22:51.487 回答