2010-06-15 8 views
1

Mon contrôleur data_files_controller.rbproblème de travail retardé dans les rails.

def upload_balances 
    DataFile.load_balances(params) 
end 

Mon modèle data_file.rb

def self.load_balances(params) 
    # Pull the file out of the http request, write it to file system 
    name = params['Filename'] 
    directory = "public/uploads" 
    errors_table_name = "snapshot_errors" 
    upload_file = File.join(directory, name) 
    File.open(upload_file, "wb") { |f| f.write(params['Filedata'].read) } 
    # Remove the old data from the table 
    Balance.destroy_all 
    # ------ more code----- 
end 

Il fonctionne très bien. Maintenant, je veux utiliser mon travail avec retard contrôleur pour appeler mon action modèle comme .. Mon contrôleur data_files_controller.rb

def upload_balances 
    DataFile.send_later(:load_balances,params)  
end 

Est-il possible ?? Quelle est l'autre façon de le faire? Cela crée-t-il un problème?

Avec cette send_later j'obtiens cette erreur dans la colonne last_error dans la table delayed_job.

uninitialized stream 
C:/cyncabc/app/models/data_file.rb:12:in `read' 
C:/cyncabc/app/models/data_file.rb:12:in `load_balances' 
C:/cyncabc/app/models/data_file.rb:12:in `open' 

Je reçois erreur sur la ligne

File.open(upload_file, "wb") { |f| f.write(params['Filedata'].read) } 

en lisant params [ 'Filedata']. Lire.

comment vérifier que je reçois des données correctes dans params ['Filedata'] ou non? Sans send_later ça marche bien ... Y at-il une solution?

Répondre

0

en utilisant send_later devrait fonctionner correctement. L'autre façon est de définir votre propre classe qui répond à perform, et appelez Delayed::Job.enqueue YourClass.new

Avez-vous eu des erreurs quelque part?

+0

J'ai modifié mon message avec des erreurs. y-a-t'il une solution? –

1

Vous devriez vérifier ce qu'il y a dans la base de données. Delayed Job doit avoir des chaînes, ou ids en interne lors de l'exécuter: très probablement

params [ « fileData »]

contient quelque chose qui n'est pas revivifiables lorsque le travail est exécuté plus tard.

+0

Si l'utilisateur télécharge un fichier csv, la première fonction load_balance créera ce fichier en public/upload et écrira le contenu du fichier original. Avec csv plus rapide, il entrera les enregistrements du fichier à la base de données. Mais il ne stocke rien params ['Filedata'] ou params ['Filename'] dans la base de données. –

Questions connexes