我正在通过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>
答案 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的字符串,数字或数据结构。