2017-06-16 5 views
1

Je suis en train de générer un fichier Excel en arrière-plan en utilisant axlsx et enregistrez-le (Rails4.2). Dans la page GitHub de axlsx, il est dit As of Rails 4.1 you must use render_to_string to render a mail attachment. Cependant, il me renvoie une erreur NoMethodError: undefined method 'render_to_string' for #<CreateExcelSheetWorker:0x007fbccf51db30>Enregistrer fichier XLSX sur le disque dans Sidekiq en arrière-plan

Ma classe ouvrière:

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 

Je ne peux pas comprendre comment résoudre ce problème, toute aide appréciée.

+0

La page Liées est pour 'axlsx_rails', pas 'axlsx', ce sont des gemmes différentes –

Répondre

2

Ce commentaire est render_to_string pour l'utilisation de la pierre dans actionmailers. En dehors de tout contexte de vue, vous devrez utiliser directement l'API xlsx Builder. Quelque chose comme ceci:

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

merci! Je me demande Y at-il un moyen d'utiliser le fichier de modèle xlsx comme dans axlsx_rails? – mdegis

1

La réponse de Sergio est très bien. Mais, si vous êtes désireux d'utiliser le modèle de axlsx_rails, vous pouvez utiliser cet exemple, qui construit un contexte faux en vue de rendre le modèle:

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

Mais ce modèle, il contient tout simplement le même genre de code (add_worksheet, add_row, etc.) Pourquoi créer un modèle et le contexte de vue faux du tout, quand vous pouvez extraire une méthode, par exemple. Est-ce que je manque quelque chose? –

+0

En outre, code postal dans la réponse directement. Les liens externes disparaissent. –

+0

Si vous avez déjà votre code dans les modèles utilisant axlsx_rails, le code ci-dessus est un moyen de garder cette façon. Rien ne vous empêche de refactoriser et d'utiliser des fonctions communes. – noel