Ruby on rails 在Rails应用程序中满足条件时,向帐户中的多个用户发送电子邮件
我有一个rails应用程序,我想在满足某些条件时向用户发送通知。我可以通过rake任务来实现这一点。目前,我可以选择符合条件的记录,并通过电子邮件将其发送到特定地址。问题是它会发送所有帐户的所有记录。以下是我在rake任务中的内容:Ruby on rails 在Rails应用程序中满足条件时,向帐户中的多个用户发送电子邮件,ruby-on-rails,ruby,ruby-on-rails-3,actionmailer,ruby-on-rails-3.2,Ruby On Rails,Ruby,Ruby On Rails 3,Actionmailer,Ruby On Rails 3.2,我有一个rails应用程序,我想在满足某些条件时向用户发送通知。我可以通过rake任务来实现这一点。目前,我可以选择符合条件的记录,并通过电子邮件将其发送到特定地址。问题是它会发送所有帐户的所有记录。以下是我在rake任务中的内容: task :send_reminds => :environment do equipment = Equipment.where("calibration_date <= ?", Date.today) EquipmentMailer.
task :send_reminds => :environment do
equipment = Equipment.where("calibration_date <= ?", Date.today)
EquipmentMailer.out_of_calibration(equipment).deliver
end
以下是我的设备Mailer的代码:
class EquipmentMailer < ActionMailer::Base
default :from => "mark.odonnell@azzurgroup.com"
def out_of_calibration(equipment)
@equipment = Equipment.where("calibration_date <= ?", Date.today)
mail(:to => "markaodonnell@gmail.com", :subject => "Equipment is out of calibration")
end
end
以下是我的HTML电子邮件的代码,它可以正常工作:
The following Equipment is Due:
<br></br>
<table>
<tr>
<th>Equipment Name</th>
<th> </th>
<th>Calibration Due Date</th>
</tr>
<% @equipment.each do |equipment| %>
<tr>
<td><%= equipment.equipment_id %></td>
<td> </td>
<td><%= equipment.calibration_date %></td>
</tr>
<% end %>
</table>
正如你所见,我将直接向自己发送电子邮件,并收到符合标准的设备清单。但这当然是不可接受的。我希望电子邮件发送给帐户中所有设备未校准的用户。以下是我的模型:
设备.rb
class Equipment < ActiveRecord::Base
acts_as_tenant(:account)
validates :equipment_id, presence: true
validates :location, presence: true
validates_uniqueness_to_tenant :serial_number
has_many :assets, :dependent => :destroy
accepts_nested_attributes_for :assets, :allow_destroy => true
has_paper_trail
def self.text_search(query)
if query.present?
search(query)
else
scoped
end
end
User.rb
class User < ActiveRecord::Base
acts_as_tenant(:account)
validates_uniqueness_to_tenant :email
attr_accessible :name, :email, :password, :password_confirmation, :title, :company,
:phone, :mobile, :admin
has_secure_password
before_save :create_remember_token
belongs_to :account
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true,
format: { with: VALID_EMAIL_REGEX }
validates :password, length: { minimum: 6 }
validates :password_confirmation, presence: true
# has_paper_trail
private
def create_remember_token
self.remember_token = SecureRandom.urlsafe_base64
end
end
Account.rb
class Account < ActiveRecord::Base
attr_accessible :subdomain, :email
VALID_SUBDOMAIN_REGEX = /\A[\w+\-.]+(-[a-z\d])+(-[a-z\d])/i
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :subdomain, :presence => true,
:uniqueness => true
validates :email, :presence => true,
format: { with: VALID_EMAIL_REGEX }
validates_presence_of :plan_id
belongs_to :plan
has_many :users
has_many :equipment, :through => :users
before_save { |account| account.subdomain = account.subdomain.downcase }
end
我在邮件中尝试了类似的方法:to=>user.email,而不是直接地址,同时将设备列表限制为特定于帐户及其用户
@equipment = Equipment.where("calibration_date <= ?", Date.today)
@equipment.each do |equipment|
equipment.accounts.each do |account|
accounts.users.each do |user|
user.email.each do |email|
mail(:to => email, :subject => "Equipment is out of calibration"
end
end
end
end
rake任务将无错误运行,但我没有收到电子邮件。思想?顺便说一句,我对rails只有一个月的了解,所以如果我遗漏了一些非常基本的东西,你必须原谅我。我猜问题就出在这段代码中
def out_of_calibration(equipment)
@equipment = Equipment.where("calibration_date <= ?", Date.today)
mail(:to => "markaodonnell@gmail.com", :subject => "Equipment is out of calibration")
end
您根本没有使用传递给该方法的参数。您的关联看起来不正确,看起来帐户应该有很多设备,帐户应该有很多用户。用户应属于账户,设备应属于账户。设备可以属于多个帐户吗?没有道理。我建议如下:
class Account < ActiveRecord::Base
has_many :users
has_many :equipments
end
class User < ActiveRecord::Base
belongs_to :account
end
class Equipment < ActiveRecord::Base
belongs_to :account
has_many :equipments, :through => :account
end
@equipment = Equipment.where("calibration_date <= ?", Date.today)
@equipment.each do |equipment|
equipment.users.each do |user|
mail(:to => user.email, :subject => "Equipment is out of calibration"
end
end
对的我需要换一个markaodonnell@gmail.com类似user.email的东西,但我需要定义该电子邮件,即设备的日期