0

このファイルをレンダリングせずにクライアントにファイル (PDF、CSV など) を送信するにはどうすればよいですか?

たとえば、Students コントローラー (scaffold を使用して作成) を想像してみてください。「新しい」フォームと「作成」アクションがあります。

  def new
    @student = Student.new
    respond_to do |format|
      format.html # new.html.erb
    end
  end

  def create
    @student = Student.new(params[:student])
    respond_to do |format|
      if @student.save
        flash[:notice] = 'Student created'
        format.html { redirect_to(@student) }
      else
        format.html { render :action => "new" }
      end
    end
  end

生徒が正常に作成されると、'show' テンプレートにリダイレクトされます。それは大丈夫です!しかし、たとえばクライアントに PDF ファイルを送信してから、「表示」アクションをレンダリングする必要があります。

この PDF ファイルは、クライアントの作成レシートのようなものです。

追加情報: Prawn を使用して PDF を作成し、次のようなコードでクライアントに送信します。

    respond_to do |format|
      format.pdf { render :layout => false }
    end

簡単に言えば、記入済みのフォームを取得し、生徒を作成し、PDF をブラウザーに (作成の領収書として) 送信し、'show' アクションをレンダリングして作成した生徒を表示する必要があります。

どうもありがとうございました。

4

3 に答える 3

5

これがwicked_pdfを使用した私のソリューションです。

これによりpdfが作成されますが、ダウンロードされません。PDF をファイルに保存します。リンクをデータベースに保存し、リンクが表示された状態でビューを再レンダリングします (ビューには @plan が表示されます)。

    # create a unique PDF filename
    pdf_uuid = UUIDTools::UUID.timestamp_create().to_s
    pdf_uuid_filename = Rails.root.join('public/pdf', "#{pdf_uuid}.pdf").to_s

    # create a pdf but don't display it
    pdf_file = render_to_string :pdf => pdf_uuid_filename, 
                                :template  => 'plans/show.pdf.erb' ,
                                :layout    => 'pdf',
                                :save_only => true
    # save to a file
    File.open(pdf_uuid_filename, 'wb') do |file|
      file << pdf_file
    end
    # create full URL path to created file  
    @plan.url = request.url[0, request.url.index("plans")] +  'pdf/' + CGI::escape("#{pdf_uuid}.pdf")
    @plan.save!
    # render the page again with the link being displayed
    redirect_to :back
于 2011-09-23T20:47:36.390 に答える
1

最も簡単な方法は、ショーページに PDF へのリンクを表示することです。しかし、本当に 1 つのステップで両方を実行したい場合は、Javascript と prawnto の ':inline => false' オプションを使用して実行できます。

prawnto オプションに:inline => falseがあることを確認してください。これにより、PDF リクエストがビューではなくダウンロード添付ファイルとして強制的にレンダリングされます。

prawnto :prawn => {
          :left_margin => 48, 
          :right_margin => 48,
          :top_margin => 24,
          :bottom_margin => 24,
          :inline => false}

次に、show.html.erb ビューの下部で、ウィンドウを JS を使用して pdf バージョンにポイントします。

<script language="JavaScript">

    window.location=<%=url_for :action=>"show", :format=>:pdf%>;

</script>

これにより、通常の html ビューが表示され、ダウンロード ダイアログ ポップアップが表示され、ユーザーに PDF を保存するように求めるメッセージが表示されますが、ユーザーは show.html ページからリダイレクトされません。

お役に立てれば

于 2011-08-23T05:17:54.437 に答える
0

ユーザーに PDF を表示したい場合は、フォームの送信が成功したときに、レンダリングされたビューでリンクを使用できるようにすることができます。次に、ユーザーはリンクをクリックして、pdf をダウンロードして表示できます。または、ユーザーがダウンロードしなくても PDF を表示したい場合は、PDF Web リーダーを使用できます。http ://www.scribd.com/ と ttp://crocodoc.com/をご覧ください。 PDF をサーバーにアップロードし、Web ユーザーがビューアーを使用して表示できるようにする機能。

この助けを願っています。

于 2011-07-24T23:31:53.543 に答える