通过resque发送电子邮件:对象视为哈希

时间:2012-02-08 19:07:55

标签: ruby-on-rails ruby-on-rails-3 actionmailer resque

我正在通过resque发送电子邮件。所有电子邮件都正常发送,除了这一个,它在本地开发中发送良好但在登台服务器上失败。

似乎将'Admin'对象视为哈希,而不是将其视为管理对象。有任何想法吗?

account.rb

class Account < ActiveRecord::Base
    after_commit :send_welcome_email

    def send_welcome_email
      SubscriptionNotifier.welcome(self).deliver
    end

end

subscription_notifier.rb

class SubscriptionNotifier < ActionMailer::Base

  def welcome(account)
    @subscriber = account
    mail(:to => account.admin.email, :subject => "Welcome!")
  end

end

Resque错误

SubscriptionNotifier Arguments

    "welcome"
    {"account"=>{"address_line1"=>nil, "address_line2"=>nil, "city"=>nil, "created_at"=>"2012-02-08T10:56:22-08:00", "currency"=>"United States Dollar (USD)", "deleted_at"=>nil, "description"=>nil, "email"=>"test2@test.com", "full_domain"=>"www.test.net", "id"=>3, "initial_plan"=>nil, "latitude"=>nil, "longitude"=>nil, "name"=>"macs", "phone"=>nil, "setup_steps_complete"=>0, "state"=>nil, "time_zone"=>"Pacific Time (US & Canada)", "updated_at"=>"2012-02-08T10:56:22-08:00", "website"=>nil, "zip"=>nil}}

Exception
    NoMethodError
Error
    undefined method `admin' for #<Hash:0x0000000585aa70>

4 个答案:

答案 0 :(得分:1)

我认为您应该将帐户ID传入队列,并让工作人员在执行其perform方法时获取Account对象。这应该可以减轻你的哈希困境。

答案 1 :(得分:0)

您需要运行'rake environment resque:work QUEUE ='*'RAILS_ENV = staging'

来加载环境

除非你有

任务“resque:setup”=&gt; :环境

在resque.rake文件中定义。

答案 2 :(得分:0)

试试这个:

在account.rb

   def send_welcome_email
      SubscriptionNotifier.welcome(self.admin.email).deliver
    end
在subscription_notifier.rb中

 def welcome(account_admin_email)
    @subscriber = account 
    mail(:to => account_admin_email, :subject => "Welcome!")
  end

我遇到了同样的错误,显然您将account作为哈希传递,并且没有电子邮件admin方法。所以只需在send_welcome_email方法中获取电子邮件并将其作为参数传递,而不是传递哈希并尝试使用welcome方法访问电子邮件。

注意:对于@subscriber,您需要传递参数,就像您在电子邮件模板中使用的那样,例如模型中的self.admin.name和欢迎方法中的@name = account_admin_name < / p>

希望这有帮助。

答案 3 :(得分:0)

这是一个古老的问题,但仍然有意义。这里的答案给出了解决方法,但是没有描述问题产生的原因或如何设计避免工作的方法。

基本上,Resque可以在Redis中保留作业,因此需要对参数进行序列化以便将其保存。您不能将Ruby对象保存在数据库中(例如),因此参数被序列化为JSON(可以持久化)。就您而言,它正在调用account.to_json并将其存储为您的工作的参数。

这可能是暂存问题,而不是开发问题,原因可能是您的开发Redis仅将作业存储在内存中(因此不需要序列化)。分段将它们持久化到例如磁盘或数据库中,因此必须对其进行序列化。

为避免此问题,作业的参数应为可转换为json的字符串,数字或数据结构。