特定の基準が満たされたときにユーザー通知を送信するレールアプリケーションがあります。私はレーキの仕事を通してこれを行うことができます。現在、基準を満たしているレコードを選択して特定の住所にメールで送ることができます。問題は、すべてのアカウントのすべてのレコードを送信することです。ここで私はrakeタスクを持っているものです。ここでRailsアプリケーションで基準が満たされた場合にアカウント内の複数のユーザーに電子メールを送信
task :send_reminds => :environment do
equipment = Equipment.where("calibration_date <= ?", Date.today)
EquipmentMailer.out_of_calibration(equipment).deliver
end
は私EquipmentMailerのためのコードは次のとおりです。ここで
class EquipmentMailer < ActionMailer::Base
default :from => "[email protected]"
def out_of_calibration(equipment)
@equipment = Equipment.where("calibration_date <= ?", Date.today)
mail(:to => "[email protected]", :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>
ご覧のとおり、私は自分宛にメールを直接送信し、その条件を満たす機器リストを受け取っています。しかし、それは当然容認できません。私は校正外の機器を持つアカウント内のすべてのユーザに電子メールを送りたいと思う。ここに私のモデルは以下のとおりです。
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+\-.][email protected][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
Account.rb
Equipment.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+\-.][email protected][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
私は(メールにこのような何かを試してみました: 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
レーキタスクはエラーなく実行されますが、メールは受信されません。思考?ところで、私はレールに約1ヶ月しかないので、もし私が何か非常に初歩的なことを逃しているなら、あなたは私を許さなければならないでしょう。
正しいです。私は "[email protected]"を "user.email"のようなものに置き換える必要がありますが、equipment_date <= Date.todayのときにアカウントにあるequipment_date <= Date.today。 –