0

我问了一个类似的问题并得到了很大的帮助,它澄清了一些理解和概念。这是第一次使用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 发布到列提醒我。我有一个单独的用户模型(设计)..

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

任何建议表示赞赏

4

1 回答 1

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

注意:确保您添加了一个验证,即没有用户会请求提醒同一本书。

于 2013-01-08T19:54:51.243 回答