Распечатать партиал в рельсах

У меня есть страница в рельсах, в которой есть несколько частичных изображений. Я хочу, чтобы многие из этих фрагментов имели ссылку, которая позволит пользователю распечатать их. В настоящее время я могу получить ссылку для печати только для печати всей страницы, а не только ее части.

Есть ли способ сделать это, или мне нужно, чтобы пользователь загружал всю страницу перед печатью?

Изменить: я хотел бы, чтобы у каждого частичного была своя отдельная ссылка для печати. Есть две строки link_to, которые я пытался использовать.

<%= link_to 'print ingredients', :partial => 'table_ingredients', :onclick => 'window.print();return false;' %>

Строка выше ничего не делает при нажатии.

<%= link_to 'print ingredients', 'table_ingredients', :onclick => 'window.print();return false;' %>

Строка выше печатает всю страницу.

Меня заставили поверить, что вторым аргументом для link_to была страница, которую следует распечатать.


person Reimus Klinsman    schedule 08.12.2015    source источник
comment
Возможно, это отвечает на ваш вопрос: stackoverflow.com/questions/1071962/   -  person Louis XIV    schedule 08.12.2015
comment
Можете ли вы показать код, который вы используете? Вы просто используете пункт меню print под file в браузере? Что вы подразумеваете под загрузкой всей страницы перед печатью? Этот вопрос требует дополнительной информации и примеров того, чего вы пытаетесь достичь.   -  person Beartech    schedule 08.12.2015
comment
Эй, вы можете отобразить этот конкретный фрагмент на новом URL-адресе и молча распечатать этот URL-адрес, используя эти ссылки, используя iframe.   -  person Vishal JAIN    schedule 08.12.2015
comment
Версия для печати - это просто стиль, если вы можете сделать отдельный контроллер для отображения версии для печати для части данных, которые вы представляете в текущем частичном, вы получите то, что хотите   -  person Ivan Shamatov    schedule 08.12.2015


Ответы (1)


Я делаю это так:

На мой взгляд, у меня есть такая ссылка:

<%= link_to 'Show Current Inventory Levels', parts_inventory_levels_path, :target => '_blank'%>

:target => '_blank' заставляет его открываться в новой вкладке/окне. parts_inventory_levels_path находится в route.rb как:

get 'parts/inventory_levels'  => 'parts#inventory_levels'

Итак, он обращается к контроллеру деталей и вызывает действие inventory_levels, которое:

def inventory_levels
  @parts = Part.all.order(:name)
  render 'inventory_levels', layout: "print_table"
end

Вот ключевая часть, layout: "print_table". У меня есть файл макета в папке app/views/layout/ с именем print_table.html.erb:

<head>
  <%= stylesheet_link_tag    'print', media: 'all' %>
  <%= javascript_include_tag 'application' %>
  <%= csrf_meta_tags %>
  <%= yield(:head) %>
</head>
<body>
  <%= yield %>
</body>

Таким образом, данные из моих вызовов действий контроллера отображаются в inventory_levels.html.erb:

<%= link_to_function('Print this Page', 'javascript:print()') %>
<br>
<table id="parts_table" class="table pretty" border='1'>
  <thead>
    <tr>
    <th class="sortable">Name</th>
    <th class="sortable">Sku</th>

  ...table omitted for brevity

Обратите внимание на первую строку, она вызывает функцию javascript:print() для печати страницы. Причина, по которой я отображаю отдельную страницу, заключается в том, что я хочу отформатировать эту страницу очень простым способом, который лучше подходит для печати. Приятно то, что я все еще могу использовать table_sorter javascript для сортировки таблицы перед ее печатью.

«Меня заставили поверить, что вторым аргументом для link_to была страница, которую следует распечатать». Это неправильно. Вторая часть link_to — это путь или URL-адрес. Rails интерпретирует ваш table_ingredients как

<a href="/<controller name>/table_ingredients">print ingredients</a>

Я не знаю имени вашего контроллера, поэтому мне пришлось использовать заполнитель.

Я мог бы помочь вам написать фактический код, но вы должны просто использовать то, что я здесь применил к вашему коду. Но если вам нужна дополнительная помощь, опубликуйте свой контроллер и любые применимые маршруты. Вы, вероятно, можете уменьшить повторяющийся код, передав одному и тому же контроллеру значение того, какой частичный код вы хотите отобразить (я визуализирую совершенно новую страницу, но частичный также должен работать). Также, вероятно, нет возможности использовать AJAX.

person Beartech    schedule 09.12.2015