2017-06-16 66 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

相关问题