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 をリマインダ_me 列に投稿します。私は別のユーザーモデル(デバイス)を持っています..

users_id がリマインダー列に投稿されたとき、それは通常の整数であり、users_id にリンクされていないという問題がありますか?

アドバイスをいただければ幸いです

4

1 に答える 1

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

注意:ユーザーが同じ本に対してリマインダーを要求しないという検証を必ず追加してください。

于 2013-01-08T19:54:51.243 に答える