使用站点更新Ruby on Rails向帐户用户发送每日电子邮件

Ste*_*mas 4 ruby-on-rails actionmailer ruby-on-rails-3

我正在尝试在我的应用程序中设置一些内容,每天向所有用户发送每日电子邮件,并为其帐户创建新闻帖子.

我已经有了CRON任务设置,但我不太了解ActionMailer,以了解如何向每个用户发送特定信息......

在我的应用中,用户属于帐户,帐户有很多用户,用户有很多想法,帐户通过用户有很多想法.

因此,如果帐户1有3个用户,那么每天我希望所有三个用户通过电子邮件在最后一天收到新的想法.

我知道这很复杂,但如果有人可以帮助一个起点,我将不胜感激.

干杯

编辑以包含来自模型的代码:

    class Account < ActiveRecord::Base
    has_many :users
    has_many :ideas, :through => :users

    class User < ActiveRecord::Base
    belongs_to :account
    has_many :ideas, :dependent => :destroy
Run Code Online (Sandbox Code Playgroud)

我基本上希望将这个源从索引页面发送到每日电子邮件中的每个用户:

    <strong>Here are some of your colleagues recent ideas:</strong>
    <% @ideas.each do |idea| %> #@ideas = Account.ideas
    <% if idea.created_at > 4.hours.ago %>
    <table class="microposts" summary="User microposts">
    <tr>
    <td class="micropost">
<span class="ideatitle"><%= idea.title %></span><br />
<span class="ideacontent"><%= idea.content %></span>
    <span class="timestamp">
    Conceived <%= time_ago_in_words(idea.created_at) %> ago.
    </span>
    </td>
    <td>
Run Code Online (Sandbox Code Playgroud)

再次感谢!

gha*_*yes 11

它将是如下(没有代码就无法获得):

daily.rake- 你的佣金任务cron每天调用

 namespace :daily do
   desc "run daily tasks"
   task :daily, :needs => :environment do
     Account.each do |account|
       account.users.each do |user|
       UserMailer.deliver_daily_email(user)
     end
   end
 end
Run Code Online (Sandbox Code Playgroud)

user_mailer.rb - 您的动作邮件发送实际的电子邮件

 UserMailer < ActiveMailer::Base
   def daily_email(user)
     @recipients  = "#{user.email}"
     @from        = "my@email"
     headers         "Reply-to" => "my@email"
     @subject     = "Your daily message"
     @sent_on     = Time.now

     @body[:user] = user
   end
 end
Run Code Online (Sandbox Code Playgroud)

daily_email.text.html.erb - 电子邮件的实际内容

 <h2>Hi <%=h @user.name %></h2>
 You like:
 <ul>
   <% @user.account.ideas.each do |idea| %>
     <li><%=h idea.title %></li>
   <% end %>
 </ul>

 -sincerely, the mailer server
Run Code Online (Sandbox Code Playgroud)

希望这能让您对如何配置它们有所了解.如果有什么问题在这里让我知道.请享用!

[编辑]

如下面的Josh Pinter所述,您可能只想向用户发送新想法(在过去24小时内创建,或跟踪用户看到的想法并排除电子邮件中的想法).您可以通过范围来执行此操作idea.rb

scope :recent, -> { where("created_at < ", 1.day.ago) }
Run Code Online (Sandbox Code Playgroud)

要么

# Note, you'll need to create and maintain a `viewed_at` column
scope :unviewed, -> { where(viewed_at: nil) }
Run Code Online (Sandbox Code Playgroud)

然后,对于每个用户,您可以检查

ideas = user.ideas.recent.any?且仅当有发送电子邮件recentunviewed想法.发送电子邮件后,您可以通过运行设置查看ideas.update_all(viewed_at: Time.now).