RoR HTML 模板到 .docx

RoR HTML template to .docx

我需要从 HTML 模板创建一个 .docx 文件,所以我使用了 htmltoword gem.

用法:

我添加了 gem (Gemfile):

gem 'htmltoword', '~> 0.5.1' #last version of the gem

我放了一条路线(route.rb):

get 'preview' => 'foo#preview'

在我的 bar.html.erb 中,我有一个 link 目标是 url:

<%= link_to '.docx', preview_path %>

模板(preview.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::UnknownFormat

如何解决这个错误?

我的配置:
RoR v4.2.4
Ruby v2.2.3p173


Also, there is an open github issue for this/similar topic.


更新:正如@kajalojha 提到的,respond_with / Class-Level respond_to has been removed to an individual gem, so I installed the responders gem,但是,我得到了同样的错误。

由于 respond_to 已从 rails 4.2 中删除给个人 gem 我建议您使用格式化程序 gem..

有关详细信息,您可以查看下面给出的 link。

Why is respond_with being removed from rails 4.2 into it's own gem?

你试过caracal-rails吗?你可以找到它here

今年早些时候,我不得不在一个应用程序中构建相同的功能,并且还使用了 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

然后我有两个 "view" 文件发挥作用。首先,是我的方法视图文件 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',现在可以使用了。

Note: as @kajalojha mentioned, respond_with / Class-Level respond_to has been removed to an individual gem, so I installed the responders gem.

让我们创建一个 download 逻辑。

Gemfile

gem 'responders'
gem 'htmltoword', '~> 0.5.1'

routes.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

download.docx.erb

<p><%= @bar %></p>

我添加了一些 link 来触发下载逻辑:

<%= link_to 'Download bar.docx', foo_download_path %>

这将下载包含 "Lorem Ipsum" 的 bar.docx 文件。