Отправка пользователям аккаунта ежедневных электронных писем с обновлениями сайта Ruby on Rails - PullRequest
4 голосов
/ 14 августа 2011

Я пытаюсь настроить что-то в своем приложении, чтобы ежедневная электронная почта рассылалась всем пользователям с новостными сообщениями, созданными для их учетной записи каждый день.

У меня уже есть настройка задачи CRON,но я не знаю достаточно о ActionMailer, чтобы выяснить, как отправить конкретную информацию каждому пользователю ...

В моем приложении пользователи принадлежат учетным записям, учетные записи имеют много пользователей, а пользователи имеют много идей и учетных записейесть много идей через пользователей.

Так что, если в учетной записи 1 есть 3 пользователя, каждый день я хочу, чтобы все три пользователя получали новые идеи в последний день по электронной почте.

Я знаю этоэто сложно, но если кто-то может помочь с отправной точкой, это было бы очень признательно.

Cheers

отредактировано, чтобы включить код из модели:

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

    class User < ActiveRecord::Base
    belongs_to :account
    has_many :ideas, :dependent => :destroy

Я в основном хочучтобы отправить этот канал со страницы индекса каждому пользователю в ежедневном электронном письме:

    <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>

Еще раз спасибо!

1 Ответ

11 голосов
/ 14 августа 2011

Это будет что-то вроде следующего (не может быть определено без кода):

daily.rake - ваша задача рейка была вызвана через cron daily

 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

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

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

Надеюсь, это даст вам хорошее представление о том, как это все должнобыть настроенным.Дайте мне знать, если что-то здесь сбивает с толку.Наслаждайтесь!

[Редактировать]

Как отметил Джош Пинтер ниже, вы, вероятно, захотите отправлять пользователю только новые идеи (созданные за последние 24 часа)или отслеживать, какие идеи видел пользователь и исключать их из электронной почты).Вы можете сделать это с помощью области в idea.rb

scope :recent, -> { where("created_at < ", 1.day.ago) }

или

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

Затем для каждого пользователя вы можете установить

ideas = user.ideas.recent.any? и толькоотправьте электронное письмо, если есть идеи recent или unviewed.После того, как вы отправите электронное письмо, вы можете настроить просмотр, набрав ideas.update_all(viewed_at: Time.now).

...