1- إنشاء نموذج Contact

rails g model contact --migration=false 

الخيار --migration=false تم إضافته إلى التعليمة السابقة من أجل عدم توليد ملف migration لأني لا أريد حفظ الرسائل التي يتم إرسالها ضمن قاعدة المعطيات.

بعد تنفيذ التعليمة السابقة نقوم باستعراض محتوى app/models/contact.rb وحذف
الامتداد < ApplicationRecord وإضافة validations

نقوم ايضا بتضمين كل من ActiveModel::Validations و ActiveModel::Model لكي يتم التعامل مع Contact كنموذج model واستخدام ميزة Validations

class Contact

	include ActiveModel::Model
	include ActiveModel::Validations

	attr_accessor :name, :email, :message

	validates :name, :presence => {:message => "الاسم فارغ، يرجى ملء الحقل"}
	validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i , :message => "البريد الالكتروني غير مقبول"
	validates :message, :presence => {:message => "الرسالة فارغة، يرجى ملء الحقل"}

end

2- Mail Class

حاليا نريد إنشاء class خاص بفورم الاتصال لإرسال الرسائل ويتم ذلك عبر التعليمة التالية:

rails g mailer ContactMailer

بعد تنفيذ التعليمة السابقة قم فتح الملف contact_mailer.rb الموجود ضمن المسار app/mailers وإضافة التابع new_contact

class ContactMailer < ApplicationMailer

  def new_contact(contact)
  	@contact = contact
    mail(to: "your.email@yourdomain.com",subject: "رسالة من #{contact.name}", from: "#{contact.name} <#{contact.email}>")
  end
  
end

3- controller

class ContactsController < ApplicationController
  def new
    @contact = Contact.new
  end

  def create
    @contact = Contact.new(contact_params)
    
    if @contact.valid?
      ContactMailer.new_contact(@contact).deliver
      redirect_to contact_path, notice: "تم إرسال الرسالة."
    else
      render :new
    end
  end

private

  def contact_params
    params.require(:contact).permit(:name, :email, :message)
  end

end

4- Routes

get '/contact', to: 'contacts#new', as: 'contact'
post '/contact', to: 'contacts#create'

5- ملفات Views

app/views/contact_mailer/new_contact.html.erb

<div style="direction:rtl;text-align:right">
	 المرسل : <%= @contact.name %>
	 <br/>
	 البريد الالكتروني: <%= @contact.email %>
	 <br/>
	 الرسالة:
	 <br/>
	<%= simple_format @contact.message %> 
</div>

app/views/contacts/new

<%= form_for @contact, url: contact_path,:html=>{class: 'form-horizontal',id:"contactForm"} do |f| %>
       <% if @contact.errors.any? %>
         <div id="error_explanation">
           <ul>
            <% @contact.errors.full_messages.each do |message| %>
            <li><%= message %></li>
            <% end %>
          </ul>
         </div>
       <% end %>
  <div class="row">
    <div class="col-sm-12">
        <div class="form-group">
            <div class="col-md-12">
             <%= f.text_field :name,class: "form-control",placeholder:"الاسم الكامل",value: current_user ? current_user.name : "" %>

            </div>
        </div>
    </div>


    <div class="col-sm-12">
        <div class="form-group">
            <div class="col-md-12">
                <%= f.text_field :email,class: "form-control",placeholder:"البريد الالكتروني",value: current_user ? current_user.email : "" %>
            </div>
        </div>
    </div>


    <div class="col-lg-12">
        <div class="form-group">
            <div class="col-md-12">
                <%= f.text_area :message,class: "form-control",placeholder: "تفاصيل الرسالة" %>          
            </div>
        </div>


        <div class="form-group">
            <div class="col-md-12 ">
                <%= f.submit "أرسل", :class=>"btn btn-primary" %>
            </div>
        </div>


    </div>

  </div>
<% end %>

5- إعداد خادم البريد

يمكن وضع إعدادات عامة تعمل ضمن جميع البيئات (development - production)
من خلال وضع الكود التالي الذي يخبر action_mailer كيفية الاتصال بخادم البريد ضمن الملف config/application.rb

في هذا المثال استخدمت خادم google

config.action_mailer.smtp_settings = {
  address: "smtp.gmail.com",
  port: 587,
  domain: "<example.tld>",
  user_name: "<username>",
  password: "<password>",
  authentication: :plain,
  enable_starttls_auto: true
}

config.action_mailer.default_url_options = {
  host: "yourdomain.tld"
}

أو يمكن تخصيص الإعدادات السابقة ضمن كل بيئة من خلال إضافتها على كل ملف ضمن المجلد environments