请原谅我的提问,我认为这是一个相当有深度的挑战(至少目前对我来说)
我有一个小应用程序,允许用户签到,退房,并希望收到电子邮件,当一本书已经签到通过一个提醒按钮注册他们的兴趣
目前我已经设置了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
我更喜欢第一个解决方案,因为它似乎是一个更易于维护的状态机。
希望对您有所帮助