0

簡単な連絡先フォームを作成しようとしているので、メーラーを実装する必要があります。

コントローラーを作成しました:

class ContactusController < ApplicationController
   def index
      @contact_us = Contactus.new
   end

   def new
      redirect_to(action: 'index')
   end

   def create
      @contact_us = Contactus.new(params[:contactus])
      if @contact_us.deliver
         flash[:notice] = "Thank-you, We will contact you shortly."
      else
         flash[:error] = "Oops!!! Something went wrong. Your mail was not sent."
      end
      render :index
    end
 end

データを保存したくないので、ActiveModel を使用しました。

class Contactus
   extend ActiveModel::Naming
   include ActiveModel::Conversion
   include ActiveModel::Validations
   include ActionView::Helpers::TextHelper
   attr_accessor :name, :email, :message

   validate :name,
       :presence => true

   validates :email,
        :format => { :with => /\b[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}\z/ }

   validates :message,
        :length => { :minimum => 10, :maximum => 1000 }

   def initialize(attributes = {})
      attributes.each do |name, value|
          send("#{name}=", value)
      end
   end

   def deliver
       return false unless valid?
   mail(
        :to => "XXXXXXXX@gmail.com",
        :from => %("#{name}" <#{email}>),
        :reply_to => email,
        :subject => "Website inquiry",
        :body => message,
        :html_body => simple_format(message)
       )
   true
 end

 def persisted?
     false
 end
end

すべて正常に動作します。ルーティングは良好で、検証は機能しますが、唯一のエラーは次のとおりです。undefined method mail for #<Contactus:0x007f9da67173e8>

その中で Contactus という名前とユーザー Model コードでメーラーを作成しようとしましたが、次のエラーが発生しました。private method new used

ActiveModel で ActionMailer 関数を使用するにはどうすればよいですか?

4

2 に答える 2

2

メーラーの設定方法をもう少し詳しく説明するには、次のコマンドを実行してメーラーを生成します。

rails generate mailer ContactMailer

という名前のファイルに次を追加しますapp/mailers/contact_mailer

class ContactMailer < ActionMailer::Base
  default from: #{from_email}

  def contact_mail(contact)
    @contact = contact
    mail(to: #{email}, subject: #{Whatever your subject would be})
  end
end

ActionMailer は、ビューを使用してメッセージのレイアウトをレンダリングします。ドキュメントを確認しましたが、html_bodyここで使用しているオプションについて何も見つかりませんでした。たぶん、それを削除して使用するbody: simple_format(message)か、テンプレートapp/views/mailers/contact_mailer/contact_mail.html.erbを作成してメッセージを自分で入れてみてください。意図的にインスタンス変数を作成したことがわかり@contactます。このようなテンプレートを作成すると、オブジェクトの使用可能なすべての属性にアクセスできるので、必要に応じてさらにカスタマイズできます。

別件で・・・

newアクションをここのアクションに転送していることが少し心配ですindex。RESTful アプローチを変更する正当な理由はありますか? 10 回中 9 回、奇妙な問題private method calledやその他の不可解なエラーが発生したのは、システムをごまかそうとしたときでした。アクションを再割り当てしnewて新しいContactusオブジェクトを作成すると、問題は解決しますか?

SMTP 設定の更新

これらの設定に対する私の雇用主の基準は、最善ではないかもしれませんが、これまでのところ私が行ったことは次のとおりです。私の中でenvironments/production.rb

config.action_mailer.raise_delivery_errors = false
config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :hash => 'of',
  :mail => 'client',
  :smtp => 'settings'
}

environments/development.rbは同じブロックをコピーしますが、最初の行を次のように置き換えます

config.action_mailer.raise_delivery_errors = true

environments/test.rbは上記のどれも追加しません。代わりに、この行を追加します

config.action_mailer.delivery_method = :test

しかし、それは、RSpec テストでメールが送信されることをテストしたいからです。

あなたの構成が でどのように見えるかはわかりませんenvironment.rbが、このように ActionMailer を介して構成していることを確認したい場合があります。当然のことながら、これらの変更を行った後にアプリを再起動し、認証の問題がまだあるかどうかを確認してください。

特定の認証の問題について

私の個人的な SMTP 設定は gmail を介して認証されるため、これらのファイルの設定には次のペアが含まれます。

:address => 'smtp.gmail.com',
:port => #{port_number},
:domain => #{our_email_domain},
:authentication => 'plain',
:enable_starttls_auto => true

portとを検索してみてくださいdomain。独自のドメインを持つビジネスでこれを行っていない場合は、Google 検索で十分です。authenticationとのsmarttls設定は、パスワードが正しく解釈されない場合に役立ちます。

于 2013-07-06T17:00:41.200 に答える
1

から継承する別のクラスを作成する必要があります。そのクラスでは、メソッドを呼び出すことができます。クラスで直接呼び出すことはできません。app/mailersActionMailer::BasemailmailContactUs

セットアップが完了したら、メーラー クラスを次のように使用できますContactUs

ContactMailer.contact_mail(self).deliver
于 2013-07-06T15:58:20.377 に答える