Я пытаюсь настроить форму, которая принимает набор критериев, запускает запрос с использованием этих критериев и либо отображает результаты в окне браузера под формой (через 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
results.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 из формы, заставляя пользователя отправлять форму через 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
Hackey? Наверное. Это работает? Да уж.