错误:AbstractController::DoubleRenderError(在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,并且每个操作最多调用一次。另请注意,重定向和渲染都不会终止执行动作,所以如果你想在重定向后退出动作,你需要执行类似“redirect_to(...) and return”的操作。)
更新时,模型检查 template.exists?,如果为 true,则下载报告并重定向到父对象。否则,只需重定向即可。
我在“if”语句的切线一侧使用“and return”,那么为什么它没有按预期工作?
def update
template = resource.check_changes(params[:well_master])
paramString = resource.to_json
update! do |format|
if resource.errors.present?
return render :edit
else
if template != ''
generateWellLetter(template, 'Rpt_Farm_Name', paramString)
else
rec = resource.PERMIT
format.html { redirect_to admin_well_master_path(rec) }
end
end
end
end
def generateWellLetter(template, letterName, params)
@URL = "#{ENV["API_HOST"]}/api/Document/Generate/#{template}"
response = HTTParty.post(@URL,
:body => params,
:headers => { "Content-Type" => "application/json" })
Zip::InputStream.open(StringIO.new(response)) do |io|
while entry = io.get_next_entry
report = io.read
send_data report, :filename => letterName + '.docx', :type => 'docx'
end
end
respond_to do |format|
rec = resource.PERMIT
format.html { redirect_to admin_well_master_path(rec) } and return
end
end
您渲染了很多次,我建议将所有渲染调用集中在一起。
# send_data is like render, you can only call it once
while entry = io.get_next_entry
report = io.read
send_data report, filename: letterName + ".docx", type: "docx"
end
# can't send_data and also render
#
# can't use respond_to and respond_with (from inherited_resources -> responders)
# that's what `update!` method is for
#
# returning inside of the respond_to block means
# `redirect_to admin_well_master_path(rec)` never runs
respond_to do |format|
rec = resource.PERMIT
format.html { redirect_to admin_well_master_path(rec) } and return
end
如果您使用继承的资源,那么您可能应该使用它,否则,它没有帮助,您应该只使用
respond_to
块与您自己的逻辑。
def update
template = resource.check_changes(params[:well_master])
update! do |success, failure|
# failure - already renders :edit so it's not needed
success.html do
if template.present?
generate_well_letter(template, resource.to_json) do |report|
send_data report, filename: "Rpt_Farm_Name.docx", type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
end
else
redirect_to admin_well_master_path(resource.PERMIT)
end
end
end
end
def generate_well_letter(template, json)
url = "#{ENV["API_HOST"]}/api/Document/Generate/#{template}"
response = HTTParty.post(url, body: json, headers: {"Content-Type" => "application/json"})
# either you're sending the whole zip file or just one file from the zip file
Zip::InputStream.open(response) do |io|
entry = io.get_next_entry
report = entry.get_input_stream.read
yield report
end
end
https://github.com/activeadmin/inherited_resources#overwriting-actions