この gem はActiveModel
の上に構築されており、すべてを自分で実装することなく、検証、名前付け、 i18n
Rails からモデルに取り込む方法を紹介します。
この README は、Rails 5 以降で使用されるMailForm gem について言及しています。 Rails の古いバージョンで MailForm を使用する方法については、利用可能なブランチを参照してください。
MailForm を使用すると、フォームから直接電子メールを送信できます。たとえば、お問い合わせフォームを作成したい場合は、次の行だけが必要です (電子メールを含む)。
class ContactForm < MailForm :: Base
attribute :name , validate : true
attribute :email , validate : / A [^@ s ]+@[^@ s ]+ z /i
attribute :file , attachment : true
attribute :message
attribute :nickname , captcha : true
# Declare the e-mail headers. It accepts anything the mail method
# in ActionMailer accepts.
def headers
{
subject : "My Contact Form" ,
to : "[email protected]" ,
from : %(" #{ name } " < #{ email } >)
}
end
end
次に、 rails console
でコンソールを起動し、次のように入力します。
>> c = ContactForm . new ( name : 'José' , email : '[email protected]' , message : 'Cool!' )
>> c . deliver
受信箱をチェックすると、電子メールが送信済みフィールドとともにそこに表示されます (メーラーの配信方法が適切に設定されていると仮定します)。
MailForm::Base
から継承すると、 ActiveModel::Validation
、 ActiveModel::Translation
、およびActiveModel::Naming
として、 ActiveModel
から一連のものをプルダウンします。
これにより、 I18n
、エラー メッセージ、検証、およびActiveRecord
と同様の属性処理がMailFormに導入されるため、追加の調整を行わずにコントローラーやフォーム ビルダーでMailForm を使用できるようになります。これは、次の代わりに次のことも意味します。
attribute :email , validate : / A [^@ s ]+@[^@ s ]+ z /i
実際にこれを行うこともできます:
attribute :email
validates_format_of :email , with : / A [^@ s ]+@[^@ s ]+ z /i
最も満足できるものをお選びください。 API の詳細については、以下を読み続けてください。
MailForm はORM ともうまく連携します。モデルにMailForm::Delivery
含めて、送信する属性を宣言するだけです。
class User < ActiveRecord :: Base
include MailForm :: Delivery
append :remote_ip , :user_agent , :session
attributes :name , :email , :created_at
def headers
{
to : "[email protected]" ,
subject : "User created an account"
}
end
end
配信はafter_create
フックでトリガーされます。
MailFormのインストールはとても簡単です。 Gemfile を編集して以下を追加するだけです。
gem 'mail_form'
次に、 bundle install
実行してMailFormをインストールします。
rails generate mail_form
を実行すると、開始するための基本的なフォームを生成する方法に関するヘルプ情報が表示されます。
フォーム属性を宣言します。ここで宣言されたすべての属性は、:captcha が true であるものを除き、電子メールに追加されます。
オプション:
:validate
- validates_*_of
へのフック。 true
指定すると、属性の存在が検証されます。正規表現の場合、形式を検証します。配列の場合、配列に属性が含まれるかどうかを検証します。
:validate
が指定されるたびに、存在が自動的にチェックされます。オーバーライドするには、 allow_blank: true
指定します。
最後に、 :validate
がシンボルの場合、シンボルとして指定されたメソッドが呼び出されます。その後、アクティブ レコード ( errors.add
) で行うのと同じように検証を追加できます。
:attachment
- 指定すると、ファイルが送信されることを予期し、電子メールに添付します。フォームをマルチタイプに設定することを忘れないでください。また、単一の添付ファイル属性を通じて複数のファイルを受け入れ、それらを電子メールに個別に添付します。
:captcha
- true の場合、属性が空白である必要があることを検証します。これはスパムを回避する簡単な方法であり、入力は CSS で非表示にする必要があります。
例:
class ContactForm < MailForm :: Base
attributes :name , validate : true
attributes :email , validate : / A [^@ s ]+@[^@ s ]+ z /i
attributes :type , validate : [ "General" , "Interface bug" ]
attributes :message
attributes :screenshot , attachment : true , validate : :interface_bug?
attributes :nickname , captcha : true
def interface_bug?
if type == 'Interface bug' && screenshot . nil?
self . errors . add ( :screenshot , "can't be blank on interface bugs" )
end
end
end
c = ContactForm . new ( nickname : 'not_blank' , email : '[email protected]' , name : 'José' )
c . valid? #=> true
c . spam? #=> true (raises an error in development, to remember you to hide it)
c . deliver #=> false (just delivers if is not a spam and is valid, raises an error in development)
c = ContactForm . new ( email : 'invalid' )
c . valid? #=> false
c . errors . inspect #=> { name: :blank, email: :invalid }
c . errors . full_messages #=> [ "Name can't be blank", "Email is invalid" ]
c = ContactForm . new ( name : 'José' , email : '[email protected]' )
c . deliver
MailForm を使用すると、クライアントからのリクエスト情報を送信メールに簡単に追加できます。やるべきことは次のとおりです。
class ContactForm < MailForm :: Base
append :remote_ip , :user_agent , :session
# ...
end
そしてコントローラーでは次のようになります。
@contact_form = ContactForm . new ( params [ :contact_form ] )
@contact_form . request = request
リモート IP、ユーザー エージェント、およびセッションは、リクエスト情報セッションの電子メールで送信されます。リクエストオブジェクトが応答する任意のメソッドを追加することができます。
MailFormの I18n は ActiveRecord と同様に機能するため、すべてのモデル、属性、メッセージをローカライズして使用できます。以下は I18n ファイルのサンプル ファイルです。
mail_form :
models :
contact_form : "Your site contact form"
attributes :
contact_form :
email : "E-mail"
telephone : "Telephone number"
message : "Sent message"
request :
title : "Technical information about the user"
remote_ip : "IP Address"
user_agent : "Browser"
使用される電子メール テンプレートをカスタマイズするには、 app/views/mail_form
にcontact.erb
というファイルを作成します。このリポジトリのlib/mail_form/views/mail_form/contact.erb
を見て、デフォルトのテンプレートがどのように機能するかを確認してください。
私たちはサポートが終了していないすべての Ruby / Rails バージョンのサポートを維持する予定です。
特定のバージョンの詳細については、Ruby および Rails のメンテナンス ポリシーとテスト マトリックスを確認してください。
バグを発見した場合は、github の問題トラッカーを使用してください。
MITライセンス。著作権 2020-2024 ラファエル フランサ、カルロス アントニオ ダ シルバ。著作権 2009-2019 Plataformatec。