RoR HTML模板到.docx

时间:2016-05-11 11:25:48

标签: ruby-on-rails ruby-on-rails-4 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_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已被移除到单个gem,所以我installed the responders gem,但是,我得到了相同的错误。

4 个答案:

答案 0 :(得分:0)

由于respond_to已从rails 4.2移除到单个gem,我将建议您使用formatter gem ..

有关详细信息,请查看以下链接。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

然后我有两个&#34;查看&#34;发挥作用的文件。第一个是我的方法视图文件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

长期回复道歉......这对我来说效果很好,我希望能帮助你解决这个问题!

答案 3 :(得分:0)

所以,我明白了。我在路线中添加了format: 'docx',现在可以正常使用了。

  

注意:正如@kajalojha所提到的,respond_with / Class-Level respond_to已被移除到单个gem,因此我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_to 'Download bar.docx', foo_download_path %>

将使用&#34; Lorem Ipsum&#34;下载bar.docx文件。在它。