2013-01-08 185 views
0

我曾問一個類似的問題,並得到了一些很大的幫助,它已經澄清了一些理解和concepts.This是使用的ActionMailer所以我想更好地瞭解獲取的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發佈到alerts_me列。我有一個單獨的用戶模型(設計)..

是我的問題的一部分是,當users_id張貼到提醒我列它只是一個普通的整數,並沒有鏈接到users_id?

任何意見讚賞

回答

1

您可以創建一個Reminder模型(和表DB),它可將用戶設置

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 

注意:確保您添加的驗證,沒有用戶會要求提醒同一本書。

+0

我在想有一個單獨的模型,那是什麼病。只是爲了我自己的確認,位於reminder_me列的id永遠不會訪問user_id嗎? – Richlewis

+0

您不再需要'Book'模型中的'remin_me'列,就像您說的那樣,您將在每個提醒中創建一個「提醒」條目。 您只需發送本書的ID,然後在控制器操作中使用'current_user'。 – Khaled

+0

你也介意解釋Reminder.create(user:current_user,book:@book),我會有一個提醒控制器?它會在創建行動?道歉不能確定你的意思 – Richlewis

相關問題