我需要从HTML模板创建一个.docx文件,所以我使用了htmltowordgem。
用法:
我添加了宝石(Gemfile):
gem 'htmltoword', '~> 0.5.1' #last version of the gem
我放了一条路线(route.rb):
get 'preview' => 'foo#preview'
在我的bar.html.erb中,我有一个链接,目标是那个url:
<%= link_to '.docx', preview_path %>
模板(预览.docx.erb):
<h1>foobar</h1>
在控制器中(foos_controller.rb):
class FoosController < ApplicationController
respond_to :docx
#other code
def preview
respond_to do |format|
format.docx do
render docx: 'foobar', filename: 'preview.docx'
end
end
end
end
然而,我得到了一个错误:
ActionController::未知格式
如何修复此错误?
我的配置:
RoR v4.4.4
Ruby v2.2.3p173
此外,这个/类似的主题还有一个开放的github问题。
更新:正如@kajalojha所提到的,respond_with / Class-Level respond_to
已经被删除到一个单独的gem中,所以我安装了响应者gem,但是,我得到了同样的错误。
由于responsd_to已从rails 4.2中删除到单个gem,我建议您使用格式化程序gem。。
有关更多详细信息,您可以查看下面的链接。
为什么响应从轨道4.2移到它';自己的宝石?
你试过卡拉卡尔导轨吗?你可以在这里找到
今年早些时候,我不得不在一个应用程序中构建同样的功能,还使用了htmltoword
gem。
# At the top of the controller:
respond_to :html, :js, :docx
def download
format.docx {
filename: "#{dynamically_generated_filename}",
word_template: 'name_of_my_word_template.docx')
}
end
然后,我有两个"视图"文件开始发挥作用。第一个,是我的方法视图文件download.docx.haml
。此文件包含以下代码:
%html
%head
%title Title
%body
%h1 A Cool Heading
%h2 A Cooler Heading
= render partial: 'name_of_my_word_template', locals: { local_var: @local_var }
从那里,我有了另一个文件name_of_my_word_template.docx.haml
,它包含了我的Word文件的精华。
%h4 Header
%h5 Subheader
%div= local_var.method
%div Some other content
%div More content
%div Some footer content
当有人点击my_app.com/controller_name/download.docx
时,会为他们生成并下载一个Word文件。
为了确保这种情况发生,我在routes.rb
文件中有一个下载方法的路径:
resources :model_name do
member do
get :download
end
end
抱歉回复太长。。。这对我来说效果很好,我希望能帮助你度过这个问题!
所以,我想明白了。我在路由中添加了format: 'docx'
,现在它可以工作了。
注意:正如@kajalojha提到的,
respond_with / Class-Level respond_to
已经被删除到一个单独的宝石中,所以我安装了响应者宝石。
让我们创建一个download
逻辑。
Gemfile
gem 'responders'
gem 'htmltoword', '~> 0.5.1'
路由.rb
get 'download' => 'foos#download', format: 'docx' #added format
foos_controller.rb
class FoosController < ApplicationController
respond_to :docx
def download
@bar = "Lorem Ipsum"
respond_to do |format|
format.docx do
# docx - the docx template that you'll use
# filename - the name of the created docx file
render docx: 'download', filename: 'bar.docx'
end
end
end
end
下载.docx.erb
<p><%= @bar %></p>
我添加了一些链接来触发下载逻辑:
<%= link_to 'Download bar.docx', foo_download_path %>
它将下载包含"Lorem Ipsum"的bar.docx
文件。