WedX - журнал о программировании и компьютерных науках

Rails 5 — рендеринг результатов отправки формы в виде js или другого формата (например, PDF)

Я пытаюсь настроить форму, которая принимает набор критериев, выполняет запрос с использованием этих критериев и либо отображает результаты в окне браузера под формой (через js), либо в виде pdf (используя Prawn) в новое окно.

index.html.erb (форма):

<%= form_for :criteria, url: results_path, method: :patch, remote: true do |f| %>
  ...input fields...
  <%= button_tag("View", remote: true, value: 'js', name: 'format' %>
  <%= button_tag("PDF", remote: true, value: 'pdf', name: 'format', formtarget: '_blank') %>
  <div id='report-results'>
  </div>
<% end %>

контроллер:

def index
end

def results
  @results = ...the query...
  respond_to do |format|
    format.js
    format.pdf do
      report = ResultsPdf.new(@results)
      send_data report.render, filename: "Results_#{Date.today}.pdf", type: 'application/pdf', disposition: "inline"
    end
  end
end

результаты.js.erb:

$('div#report-results').empty();
$('div#report-results').html("<%= escape_javascript(render 'report_results') %>");

С этим кодом работает опция «Просмотр» (отображает результаты в браузере), но опция «PDF» ничего не делает. Сервер показывает, что он попадает в контроллер как PDF, выполняет запрос и отправляет данные, но сам PDF не создается. Если я удалю remote: true из объявления формы, тогда параметры PDF будут работать, но параметр «Просмотр» просто отображает текст results.js.erb в браузере.


  • Вы видите данные в формате PDF в браузере? 23.08.2017
  • @ Паван Нет. На сервере я вижу, что он обрабатывает действие контроллера как PDF, запускает запрос с предоставленными критериями и отправляет затем отправленные данные Results_08/23/2017.pdf, но браузер ничего не делает. 23.08.2017
  • @ CChandler81 Вы пробовали это? stackoverflow.com/a/7293155/1154044 23.08.2017
  • @cnrr Второй пример в этом ответе - это именно то, что у меня есть в моем блоке format.pdf выше. 23.08.2017
  • @ CChandler81, вы добавили remote: true в форму, поэтому, когда вы отправляете форму, ее формат всегда будет js. Я предлагаю удалить форму и добавить две ссылки, только одну с форматом js, а другую с форматом pdf, если вы не можете изменить логику в контроллере как согласно params 23.08.2017
  • @pitabasprathal Как я уже сказал в своем вопросе, если я удалю remote: true, тогда кнопка PDF будет работать, но кнопка «Просмотр» (js) просто отображает текст связанного файла .js. Обычные ссылки не будут работать, потому что мне нужно отправить форму. 23.08.2017
  • @ CChandler81 У вас есть файл application.pdf.erb. Почему бы вам не использовать wicked_pdf gem? 23.08.2017
  • @pitabasprathal Потому что я уже использую Prawn для других целей и не хочу просто создавать PDF-файлы из HTML. Я считаю Prawn гораздо более гибким генератором PDF. Я не думаю, что Wicked PDF все равно не решит мою проблему. 23.08.2017

Ответы:


1

Вот как я заставил это работать (на данный момент, во всяком случае):

Удалена кнопка PDF из формы, заставляющая пользователя отправлять форму через ajax и просматривать результаты в браузере.

Добавил ссылку в партиал report_results и передал идентификаторы записей, полученных в результате запуска на шаге 1, в качестве параметра:

<%= link_to "PDF", results_path(ids: @results.ids, format: 'pdf'), class: "btn", target: "_blank" %>

В контроллер добавлен блок if/else, чтобы определить, пришел ли запрос к действию из отправки формы или ссылки на pdf:

if params[:criteria]  
  @results = ...query based on params[:criteria]...  
elsif params[:ids]  
  @results = ...query based on params[:ids]...  
else  
  ...error handling...  
end

Хаки? Наверное. Это работает? Ага.

24.08.2017
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]