2010-02-02 3 views
0

J'essaie d'utiliser le plugin Whenever pour les rails pour effectuer un processus de modèle à certains moments.Rails Erreur lors de la tentative de courrier à plusieurs utilisateurs

Lorsque j'essaie d'utiliser le processus mail_out dans mon modèle utilisateur, j'obtiens l'erreur suivante. Quelqu'un peut-il me diriger dans la bonne direction de ce qui ne va pas?

/var/lib/gems/1.8/gems/rails-2.3.5/lib/commands/runner.rb:48: /var/lib/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:380:in `load_without_new_constant_marking': /home/tnederlof/Dropbox/Ruby/daily_trailer/app/models/user.rb:9: syntax error, unexpected tIDENTIFIER, expecting ')' (SyntaxError) @users = find(:all, :conditions => "#{weekday}sub = "t"") 

Mon schedule.rb est la suivante:

every 1.day, :at => '5:30 am' do 
    runner "User.mail_out" 
    end 

Mon modèle d'utilisateur est:

class User < ActiveRecord::Base 

    acts_as_authentic 

    def self.mail_out 

    weekday = Date.today.strftime('%A').downcase 

    @users = find(:all, :conditions => "#{weekday}sub = t") 


    @users.each { |u| UserMailer.deliver_mail_out(u)} 


    end 

end 

Mon User_mailer est:

class UserMailer < ActionMailer::Base 
    def mail_out(users) 
    @recipients = { } 
    users.each do |user| 
     @recipients[user.email] = { :name => user.name } 
    end 


    from  "[email protected]" 
    subject  "Check out the trailer of the day!" 
    body  :user => user 
    end 

end 

Migration:

create_table "users", :force => true do |t| 
    t.string "email" 
    t.date  "birthday" 
    t.string "gender" 
    t.string "zipcode" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "crypted_password" 
    t.string "password_salt" 
    t.string "persistence_token" 
    t.string "mondaysub",   :default => "f", :null => false 
    t.string "tuesdaysub",  :default => "f", :null => false 
    t.string "wednesdaysub",  :default => "f", :null => false 
    t.string "thursdaysub",  :default => "f", :null => false 
    t.string "fridaysub",   :default => "f", :null => false 
    t.string "saturdaysub",  :default => "f", :null => false 
    t.string "sundaysub",   :default => "f", :null => false 
    end 

Répondre

1

Modifier cette ligne

@users = find(:all, :conditions => "#{weekday}sub = t") 

à

@users = find(:all, :conditions => ["#{weekday}sub = t"]) 

Les conditions clés pour la méthode de découverte prend soit un tableau ou hachage comme valeur. Si vous utilisez array, le premier élément du tableau est immédiatement converti en une instruction sql "where" clause si vous n'avez aucun point d'interrogation et si vous avez ces points d'interrogation sont remplacés par les autres éléments du tableau. Par exemple, le changement ci-dessus à la question la notation de la marque deviendra

@users = find(:all, :conditions => ["#{weekday}sub = ?", 't']) 

quand « t » est une chaîne

Il est préférable d'utiliser la notation de point d'interrogation, car il est plus sûr que vous ne faites pas l'interpolation de chaîne dans votre chaîne sql qui peut être très dangereux pour vos données d'application.

Vous pouvez également écrire votre requête de hachage conditions comme si

@users = find(:all, :conditions => {"#{weekday}sub".to_sym => 't'}) 

La plupart des gens préfèrent ce sur la notation des tableaux d'autres mots considèrent cela comme les rails façon de le faire.

Et un autre point, en regardant votre UserMailer méthode # mailout, vous n'avez pas besoin de faire

@users.each { |u| UserMailer.deliver_mail_out(u)} 

dans votre méthode de User.mailout, vous pouvez juste faire

UserMailer.deliver_mail_out(@users) 

parce que vous sont déjà en train d'extraire chaque objet utilisateur du tableau users dans votre mailing # UserMailer et de les ajouter aux destinataires.

+0

Merci, vous avez été très utile pour m'expliquer cela. Fait parfaitement sens! –

Questions connexes