让Actionmailer发送电子邮件

时间:2013-01-08 19:17:34

标签: ruby-on-rails ruby-on-rails-3 actionmailer

我已经提出了类似的问题,并得到了一些很大的帮助,它澄清了一些理解和概念。这是第一次使用动作管理器,所以我想要更好地理解

我想要实现的是将电子邮件发送给点击提醒我按钮的用户。这是一个简单的图书馆应用程序,用户可以检查,签入并在检查书籍时请求提醒。我只是在最后一部分逻辑上苦苦挣扎,一旦我看到它正常工作我相信我会理解它更好

因此,当书籍的check_out状态发生变化时,书籍模型会有各种帖子

Check out

<%= form_for @book do |f| %>
<%= f.label :checked_out, "Check Book Out?" %>
<%= f.check_box :checked_out, {}, true %>
<%= f.hidden_field :user_id, :value => current_user.id %>
<%= f.hidden_field :checked_out, :value => true %>
<%= f.submit 'Checkout' %>
<% end %>

Check In

<%= form_for @book do |f| %>
<%= f.label :checked_out, "Check Book Back In" %>
<%= f.check_box :checked_out, {checked: false}, false  %>
<%= f.hidden_field :user_id, :value => nil %>
<%= f.hidden_field :checked_out, :value => false %>
<%= f.submit 'Check In' %>
<% end %>

Register Interest

<%= form_for @book do |f| %>
<%= f.label :remind_me, "let Me know when book back in" %>
<%= f.check_box :remind_me, {checked: false}, false  %>
<%= f.hidden_field :remind_me, :value => current_user.id %>
<%= f.submit 'Remind Me' %>
<% end %>

在我的书模型中,我有这样的逻辑来识别当在提醒我请求之后检查书籍时,会发送电子邮件通知用户该书已回到库中

after_save :reminder_mailer

def reminder_mailer
if !self.checked_out && self.changes[:user_id] && self.user.nil?
ReminderMailer.remind_email(@user).deliver
end

和我的动作邮件

class ReminderMailer < ActionMailer::Base
default from: "my email address"

def remind_email(user)
@user = user
mail(:to => user.email, :subject => "Library Clerk")

end
end

正如您可能会看到我正在努力解决通过用户发送电子邮件提醒我请求的内容。当提醒我请求时,我将users_id发布到列remind_me。我有一个单独的用户模型(设计)..

我的问题的一部分是,当users_id发布到提醒我列时,它只是一个常规整数而没有链接到users_id?

任何建议表示赞赏

1 个答案:

答案 0 :(得分:1)

您可以创建Reminder模型(以及数据库中的表格)来跟踪用户设置的提醒

class Reminder < ActiveRecord::Base
  belongs_to :user
  belongs_to :book
end

class Book < ActiveRecord::Base
  has_many :reminders
end

在图书旁边显示一个按钮,请务必将@reminder = Reminder.new添加到呈现以下表单的操作中。

<%= form_for @reminder do |f| %>
<%= f.label :remind_me, "let Me know when book back in" %>
<%= f.hidden_field :book_id, :value => @book.id %>
<%= f.submit 'Remind Me' %>
<% end %>

您将拥有一个提醒控制器,(将resources :reminders, only: [:create]添加到routes.rb)

class RemindersController < ApplicationController
  def create
    @book = Book.find(params[:reminder][:book_id])
    Reminder.create(user: current_user, book_id: @book.id)
    redirect_to @book
  end
end

然后在您的图书模型的after_save中,您会向所有有本书提醒的用户发送电子邮件

def reminder_mailer
  if !self.checked_out && self.changes[:user_id] && self.user.nil?
    # get all users waiting for a remind on this book
    @users = self.reminders.map(&:user)
    @users.each do |user|
      ReminderMailer.remind_email(user).deliver
    end
    # remove reminders as users have been reminded
    self.reminders.destroy_all
  end
end

注意:请确保添加验证,用户不会向同一本书请求提醒。