0

私が信じていることはかなり深い挑戦だと思うことを尋ねてすみません(とにかく現時点では私にとっては)

ユーザーがチェックイン、チェックアウトし、できればリマインダーボタンを介して興味を登録することで本が再びチェックインされたときにメールを受信できる小さなアプリがあります

これまでのところ、アクションメーラーをセットアップしました(基本セットアップ)

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フィールドがfalseでbook.user_idがnilに戻ったときに、メールを送信してほしいということですreject_me 列に user_id があるユーザー

私はこれについて正しい方法で考えていますか?

誰かがそれを助けることができれば、私はこれから学び、何が起こっているのかを理解するまでそれを練習し続けることができます.

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

新しいコントローラー メソッドのルートを追加することを忘れないでください。

フォームを維持する場合の 2 番目の方法は、短くなりますが、より複雑になります。データが変更されたかどうかを確認するコールバックをモデルに追加する必要があります。たとえば、モデルを予約する場合:

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 に答える