首页 > 解决方案 > 如何在 render_to_string 之后重定向到 html 页面?

问题描述

在我的控制器操作中PagesController#transfer,我想下载一个 xml 文档,然后重新加载页面。

但是 xml 文档是生成的,render_to_string所以当我在下载文件后尝试添加重定向时出现错误。

这样做的目的是在下载 XML 后获得一条 Flash 消息。所以重新加载页面似乎是一个不错的选择。

pages_controller

def transfer
   ...
   multiple_export_to_sepa(objects, @errors)
end


private

def multiple_export_to_sepa(objects, errors)
    sepa_filename = "virements_#{params[:type]}.xml"
    if objects.present?
      stream = render_to_string(template: "admin/pages/transfers_#{params[:type]}.xml", layout: false)
      send_data(stream, type: 'text/xml', filename: sepa_filename , status: :created)
      flash[:success] = "#{objects.length} objects has been generated."
      redirect_to action: :transfer
    else
      redirect_to action: :transfer
    end
end

标签: ruby-on-railsruby

解决方案


你试过使用flash.now吗?

def multiple_export_to_sepa(objects, errors)
    sepa_filename = "virements_#{params[:type]}.xml"
    if objects.present?
      stream = render_to_string(template: "admin/pages/transfers_#{params[:type]}.xml", layout: false)
      send_data(stream, type: 'text/xml', filename: sepa_filename , status: :created)
      flash.now[:success] = "#{objects.length} objects has been generated."
    else
      redirect_to action: :transfer
    end
end

从文档(http://guides.rubyonrails.org/action_controller_overview.html#flash-now):

5.2.1 flash.now 默认情况下,将值添加到 flash 将使它们可用于下一个请求,但有时您可能希望在同一个请求中访问这些值。例如,如果创建操作未能保存资源并且您直接呈现新模板,则不会导致新请求,但您可能仍希望使用 flash 显示消息。为此,您可以像使用普通 flash 一样使用 flash.now:

class ClientsController < ApplicationController
  def create
    @client = Client.new(params[:client])
    if @client.save
      # ...
    else
      flash.now[:error] = "Could not save client"
      render action: "new"
    end
  end
end

推荐阅读