Как сделать PDF без использования response_to format.pdf в Rails? - PullRequest
0 голосов
/ 25 июля 2011

Как я могу отрендерить отправку клиенту файла (PDF, CSV и т. Д.) Без рендеринга этого файла?

Например, представьте контроллер учеников (созданный с помощью скаффолда), у нас есть «новая» формаи действие «создать»:

  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

Когда ученик успешно создан, он будет перенаправлен на шаблон «показать».Все в порядке!Но мне нужно отправить клиенту, например, файл PDF, а затем выполнить действие «show».

Этот файл PDF похож на квитанцию ​​о создании для клиента.

Дополнительная информация: теперь используйтеКреветка для создания PDF и отправки клиенту с помощью кода, подобного следующему:

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

Вкратце, мне нужно получить заполненную форму, создать студента, отправить PDF в браузер (как квитанция о создании) и выполнить действие «показать»для отображения созданного студента.

Большое спасибо.

Ответы [ 3 ]

5 голосов
/ 24 сентября 2011

Вот мое решение с использованием 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
1 голос
/ 23 августа 2011

Самый простой способ на сегодняшний день - просто показать ссылку на PDF на странице шоу. Но если вы действительно хотите сделать оба шага за один шаг, вы можете сделать это, используя Javscript и опцию ': inline => false' для prawnto.

убедитесь, что ваши параметры prawnto имеют : inline => false , это заставит PDF-запрос отображаться в качестве файла загрузки, а не представления.

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

затем в нижней части окна просмотра show.html.erb укажите окно в pdf-версии, используя JS.

<script language="JavaScript">

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

</script>

Это покажет нормальное представление html, а затем всплывающее диалоговое окно загрузки покажет, что пользователь должен сохранить PDF, но не перенаправит пользователя со страницы show.html.

Надеюсь, это поможет

0 голосов
/ 25 июля 2011

Если вы хотите отобразить PDF-файл для пользователя, вы можете сделать ссылку доступной в вашем представлении после успешной отправки формы.Затем пользователь может нажать на ссылку и скачать и просмотреть PDF.Или, если вы хотите отобразить PDF без необходимости загружать его, вы можете использовать программу чтения PDF: посмотрите http://www.scribd.com/ и ttp: //crocodoc.com/, оба предлагают возможность загрузитьpdf на свои серверы и чтобы ваш веб-пользователь мог видеть его с помощью своего средства просмотра.

Надеюсь, что эта помощь.

...