在 rails 中打印部分内容
Print a partial in rails
我在 rails 中有一个页面,其中呈现了多个部分。我希望其中的许多部分都有一个 link,这将允许用户打印它们。目前,我只能使用 print link 来打印整个页面,而不仅仅是部分页面。
有没有办法做到这一点,或者我是否需要用户在打印前加载整个页面?
编辑:
我想让每个部分都有自己的单独打印 link。我尝试使用了两条 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 的第二个参数是应该打印的页面。
我是这样做的:
在我看来,我有这样一个 link:
<%= link_to 'Show Current Inventory Levels', parts_inventory_levels_path, :target => '_blank'%>
:target => '_blank'
导致它在新的 tab/window 中打开
parts_inventory_levels_path
在 routes.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 对 table 进行排序。
"I was lead to believe that the second argument for link_to was the page that should be printed." 这是不正确的。 link_to
的第二部分是路径或 url。 Rails 将您的 table_ingredients
解释为
<a href="/<controller name>/table_ingredients">print ingredients</a>
我不知道你的控制器名称,所以我不得不使用占位符。
我可以帮助您编写实际代码,但您应该能够使用我在此处应用到您的代码中的内容。但是,如果您需要更多帮助,请 post 您的控制器和任何适用的路线。您可以通过向同一控制器传递一个关于您要呈现哪个部分的值来减少重复代码(我正在呈现一个全新的页面,但该部分也应该可以工作)。也有可能离开使用 AJAX.
我在 rails 中有一个页面,其中呈现了多个部分。我希望其中的许多部分都有一个 link,这将允许用户打印它们。目前,我只能使用 print link 来打印整个页面,而不仅仅是部分页面。
有没有办法做到这一点,或者我是否需要用户在打印前加载整个页面?
编辑: 我想让每个部分都有自己的单独打印 link。我尝试使用了两条 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 的第二个参数是应该打印的页面。
我是这样做的:
在我看来,我有这样一个 link:
<%= link_to 'Show Current Inventory Levels', parts_inventory_levels_path, :target => '_blank'%>
:target => '_blank'
导致它在新的 tab/window 中打开
parts_inventory_levels_path
在 routes.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 对 table 进行排序。
"I was lead to believe that the second argument for link_to was the page that should be printed." 这是不正确的。 link_to
的第二部分是路径或 url。 Rails 将您的 table_ingredients
解释为
<a href="/<controller name>/table_ingredients">print ingredients</a>
我不知道你的控制器名称,所以我不得不使用占位符。
我可以帮助您编写实际代码,但您应该能够使用我在此处应用到您的代码中的内容。但是,如果您需要更多帮助,请 post 您的控制器和任何适用的路线。您可以通过向同一控制器传递一个关于您要呈现哪个部分的值来减少重复代码(我正在呈现一个全新的页面,但该部分也应该可以工作)。也有可能离开使用 AJAX.