ruby on rails -满足以下参数时的ActionMailer交付



请原谅我的提问,我认为这是一个相当有深度的挑战(至少目前对我来说)

我有一个小应用程序,允许用户签到,退房,并希望收到电子邮件,当一本书已经签到通过一个提醒按钮注册他们的兴趣

目前我已经设置了actionmailer (basic setup)

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字段为假和书。user_id返回nil我希望邮件发送给user_id在remind_me列的用户

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

如果有人能帮助我,我将不胜感激,这样我就可以从中学习,然后继续练习,直到我明白是怎么回事

有两种回答方式:

第一个,不要用表单来签入一本书,只调用一个方法。例如:你用一个链接来替换你的表单,这个链接调用了控制器中的一个新方法:

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

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

希望对您有所帮助

相关内容

  • 没有找到相关文章