0

请原谅我问我认为什么是一个相当深入的挑战(无论如何现在对我来说都很好)

我有一个小应用程序,允许用户通过提醒我按钮注册他们的兴趣来签入、签出并希望在重新签入一本书时收到电子邮件

到目前为止,我已经设置了 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 列中,而我想要实现的是,当 check_out 字段为 false 并且 book.user_id 回到 nil 时,我希望电子邮件发送user_id 在remind_me 列中的用户

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

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

4

1 回答 1

3

有2种方式来回答:

第一个,不要使用表单签入一本书,而只是调用一个方法。例如:您将表单替换为在控制器中调用新方法的链接:

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

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

我希望这有帮助

于 2013-01-08T14:44:39.840 回答