0

Rails を初めて使用するので、アプリに「サブスクライブ」機能を追加したいと考えています。

誰かが私のウェブサイトを購読するたびに、なんとか(電子メールで)通知を受け取ることができました. 私が今やりたいことは、ユーザーに感謝の気持ちを伝える通知を送ることです。

私が持っているもの:

/models/contact.rb

class Contact < MailForm::Base
  attribute :name
  attribute :email,     :validate => /\A([\w\.%\+\-]+)@([\w\-]+\.)+([\w]{2,})\z/i
  attribute :message
  attribute :nickname,  :captcha  => true
  def headers
    {
      :subject => "New Subscription:",
      :to => "email@example.com",
      :from => "email@example.com"
    }
  end
end

/controllers/contacts_controller.rb

class ContactsController < ApplicationController
  def create
      @contact = Contact.new(params[:contact])
      @contact.request = request
      if @contact.deliver
        redirect_to(:back)
      else
        #TODO fail notification
        redirect_to(:back)
      end
  end
end

私が試したこと:

  • ActionMailer::Base クラスを使用して電子メールを送信しますが、フォームから params[:contact][:email] を取得できないため、応答を電子メールで送信できません
  • メールフォームを使用して複数のメールを送信しましたが、達成できませんでした

ここでの問題は、ユーザー モデルがないことです。このアプリにはストレージがないため、ユーザー モデルも必要ありません。

4

1 に答える 1

0

私が提案できるのは、ApplicationRecord から Contact モデルを生成し、Web サイトを購読しているすべての人を保存することです。その後、ActiveJob を使用して、ありがとう通知を送信できます。And Then 通知をメールに追加して、誰かがあなたの Web サイトに応募したときに通知を受け取ることもできます。

変更点の一部を次に示します。

bin/rails g model Contact name:string email:string message:text is_sent:boolean

メッセージが送信されたことを示すブールフィールドを追加しましたが、これはそのままにしておくことができます。

そのため、model.contact を使用して MailForm::Base から継承する代わりに、連絡先をデータベースに保存する連絡先モデルを作成しています。後でこれらのユーザーの参照を取得し、それらからユーザー アカウントを作成したり、他の有用なことを実行したりできるため、ti は良い方法だと思います。

連絡先レコードを保存すると、コントローラー内で ActiveJob を使用してメールの送信を開始したり、デフォルトのメーラーを使用してメールを送信したりできます。したがって、コントローラー内に次のようなものがあります

def create
  @contact = Contact.create(contact_params)
  if @contact.persisted?
    ContactMailer.say_thank_you(@contact).deliver_now
    ContactMailer.notify_webmaster(@contact).deliver_now
    # do the success redirect...
  else
    # do the failed redirect...handle error etc
  end

したがって、最初にレコードをデータベース チェックに保存し、保存されているかどうかを確認してから、別の電子メール テンプレートでユーザーとウェブマスターに通知します。say_thank_you と notify_webmaster の例で使用したアクション メール メソッドの生成については、入門ガイドを参照してください。

http://guides.rubyonrails.org/action_mailer_basics.html

あなたはレールに慣れていないので、移行の作成とパラメーター contact_params....params.require(:contact).permit(:name.... の許可に精通していると仮定しました-デフォルトの足場を使用してコード生成コードを確認できますコントローラー内部。

上記の例では、デフォルトで false に設定されたブール値のプロパティである is_sent を使用しています。次に、ActionMailer がメールを送信したら、このフィールドを更新するか、後で再試行します。誰がメールを受信したかを知るだけですが、これはオプションです。

それが役に立てば幸い。

于 2016-06-16T18:34:49.330 に答える