RoR HTML template to .docx



我需要从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文件。

相关内容

  • 没有找到相关文章

最新更新