2017-06-16 118 views
1

我想通過使用axlsx並保存它(Rails4.2)在後臺生成excel文件。在axlsx的GitHub頁面中,它表示As of Rails 4.1 you must use render_to_string to render a mail attachment。然而,它引發了我的錯誤NoMethodError: undefined method 'render_to_string' for #<CreateExcelSheetWorker:0x007fbccf51db30>將xlsx文件保存到Sidekiq中的磁盤作爲背景

我工人階級:

class CreateExcelSheetWorker 
    include Sidekiq::Worker 
    include Sidetiq::Schedulable 

    recurrence { daily } 

    def perform() 
    model = SomeModel.where(wanted: true).order(started_at: :desc) 
    xlsx = render_to_string handlers: [:axlsx], formats: [:xlsx], template: "template/file", locals: {model: model} 
    path = "/tmp/a.xlsx" 
    File.open(path, "w+") do |f| 
     f.write(xlsx) 
    end 
    end 
end 

我無法弄清楚如何解決這一問題,任何幫助表示讚賞。

+0

您鏈接的頁面是'axlsx_rails',不''axlsx',那些是不同的寶石 –

回答

2

render_to_string評論是關於在操作系統中使用gem的。除了任何類型的視圖上下文之外,您都必須直接使用xlsx builder api。類似這樣的:

package = Axlsx::Package.new do |p| 
    p.workbook.add_worksheet(name: "Summary") do |sheet| 
    sheet.add_row ["foo", 1] 
    end 
end 

File.write(filename, package.to_stream.read) 
+0

謝謝!我不知道有沒有什麼辦法像axlsx_rails一樣使用xlsx模板文件? – mdegis

1

Sergio的回答很好。但是,如果你想要使用axlsx_rails模板,你可以用這個例子,它建立一個假的視圖上下文來渲染模板:

require 'abstract_controller' 
require 'action_controller' 
require 'action_view' 
require 'active_record' 

# require any helpers 
require './app/helpers/application_helper' 

# active record only if data is here 
require './app/models/widget' 
ActiveRecord::Base.establish_connection(
    adapter: 'sqlite3', 
    database: 'db/development.sqlite3' 
) 

ActionController::Base.prepend_view_path "./app/views/" 
# place data in view_assigns 
view_assigns = {widgets: Widget.all} 
av = ActionView::Base.new(ActionController::Base.view_paths, view_assigns) 
av.class_eval do 
    # include any needed helpers (for the view) 
    include ApplicationHelper 
end 

# normal render statement 
content = av.render template: 'widgets/index.xlsx.axlsx' 
# do something with content, such as: 
File.open("/tmp/with_runner.xlsx","w+b") {|f| f.puts content } 

https://gist.github.com/straydogstudio/dceb775ead81470cea70

+0

但是,該模板只包含相同類型的代碼(add_worksheet,add_row等)。例如,爲什麼要創建模板和假視圖上下文,例如,只需提取方法即可。我錯過了什麼嗎? –

+0

另外,直接在答案中發佈代碼。外部鏈接死了。 –

+0

如果您已經使用axlsx_rails在模板中創建了代碼,那麼上面的代碼就是保持這種方式的一種方法。沒有什麼可以阻止你重構和使用通用函數。 – noel