满足以下参数时的ActionMailer交付

时间:2013-01-08 11:53:21

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

请原谅我,我相信这是一个非常深刻的挑战(无论如何我现在都很好)

我有一个小应用程序,允许用户通过提醒我按钮注册他们的兴趣来检查书籍时检查,结账并希望收到电子邮件

到目前为止,我已经设置了actionmailer(基本设置)

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

def remind_email(book)
@book = book
@url = "http://localhost:3000"
mail(:to => @book.user.email, :subject => "Book Reminder")


end

我已经准备好发送电子邮件的所有配置,因为我已经通过设计发送了这些电子邮件。

我还创建了邮件模板。这是我坚持的逻辑。

因此,当用户检查书籍时,我将其传回模型

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

签入

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

注册兴趣

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

所以我的想法是,当你注册你的兴趣时,你的用户id被放入remind_me列,我想要实现的是当checked_out字段为false并且book.user_id回到nil时我希望这封电子邮件发送user_id在remind_me列中的用户

我是否以正确的方式思考这个问题?

如果有人可以提供帮助,我将不胜感激,以便我可以从中学习,然后继续练习,直到我明白发生了什么

1 个答案:

答案 0 :(得分:3)

有两种方法可以回答:

第一个,不要使用表格来检查书籍而只是调用方法。例如:您使用在控制器中调用新方法的链接替换表单:

<%= link_to "check in", check_in_book_path(@book.id) %>

在你的books_controller中,你可以调用一个模型方法来检查书中的内容:

def check_in
  @book = Book.find params[:id]
  @book.check_in!
  redirect_to book_path(@book)
end

在你的书模型中:

def check_in!
  self.user = nil
  self.checked_out = false
  if self.save
    RemindMailer.remind_mail(self).deliver
  end
end

不要忘记为新控制器方法添加路线。

第二种方式,如果你保留你的形式,则更短但更复杂。您需要向模型添加回调,以验证数据是否已更改。例如,在您预订模型中:

after_save :send_mail_if_check_in

def send_mail_if_check_in
  if !self.checked_out && self.changes[:user_id] && self.user.nil?
    RemindMailer.remind_mail(self).deliver
  end
end

我更喜欢第一种解决方案,因为它似乎是一种更易维护的状态机。

我希望这个帮助