我有以下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
这样做的正确方法是什么?
答案 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