Rails Contact form készítése

Ruby on Rails keretrendszerhez contact form készítésének mikéntjént fogom bemutatni. Egy hétköznapi contact formhoz nincs szükségünk adatbázisra, ezért nem kell activerecord model a formhoz, helyette az active_form plugin-t fogjuk használni.
Mivel a rails-el elég gyorsan össze lehet rakni egy teszt alkalmazást ezért azon keresztül fogom bemutatni a form készítését.

Hozzunk létre egy mappát és telepítsük a railst:

 rails ./

Ezzel elkészül a programunk váza. A contact formhoz kellene fog egy model, de mivel nem activerecord model-t akarunk így a rails generátora nem lesz jó nekünk. Az ActiveForm plugint az alábbi sorokkal tudjuk telepíteni:

 ./script/plugin install http://github.com/realityforge/rails-active-form.git

Az app/models mappába hozzunk létre egy fájlt contact_form.rb néven a következő tartalommal.

class Contact < ActiveForm 
  attr_accessor :name,:email,:tel,:message
  validates_presence_of :name,:email,:message
 
  #rails activerecord fix
  def self.self_and_descendants_from_active_record
   [self]
  end
 
  def self.human_attribute_name(attribute_key_name, options = {})
   defaults = self_and_descendants_from_active_record.map do |klass|
   "#{klass.name.underscore}.#{attribute_key_name}""#{klass.name.underscore}.#{attribute_key_name}"
   end
   defaults << options[:default] if options[:default]
   defaults.flatten!
   defaults << attribute_key_name.humanize
   options[:count] ||= 1
   I18n.translate(defaults.shift, options.merge(:default => defaults, :scope => [:activerecord, :attributes]))
  end
 
  def self.human_name(options = {})
   defaults = self_and_descendants_from_active_record.map do |klass|
     "#{klass.name.underscore}""#{klass.name.underscore}"
   end
   defaults << self.name.humanize
   I18n.translate(defaults.shift, {:scope => [:activerecord, :models], :count => 1, :default => defaults}.merge(options))
  end
  #eof fix
end

A fenti sorokkal definiáljuk a model-ünket amit az ActiveForm osztályból származtatunk és az attr_accessor -al hozzárendeljünk a tulajdonságait. Mivel nem egy activerecord modelt hozunk létre így szükség van három metódus definiálására amit az activerecord-tól örökülne a model-ünk, mert ezek hiányában a rails hibát dobna.
Ezután már csak egy kis validálásra van szükség a formhoz, amit a validates_presence_of -al adunk meg.
Létre kell hoznunk egy controllert is, ami kiszolgálja a formunkhoz kapcsolódó kéréseket. Ezt az osztályt app/controllers/ mappában létrehozott contact_controller.rb fájlban definiálunk:

class ContactController < ApplicationController
 
  def index
 
  end
 
end

A routes.rb fájlba be kell állítanunk egy routot a formunkhoz:

  map.contact '/kapcsolat',:controller => 'contact',:action => 'index'

Szükségünk lesz egy view-ra is, amiben a form layout-ját hozzuk létre. Ezt az app/views/contact/index.html.erb néven hozzuk létre:

<% form_for :contact,:url => contact_path,:method => 'post' do |f| %>
<%= f.error_messages %><br />
 
<%= flash[:notice] %><br />
<label>Név</label>
<%= f.text_field :name %><br />
<label>Email</label>
<%= f.text_field :email %><br />
<label>Phone</label>
<%= f.text_field :phone %><br />
<label>Message</label>
<%= f.text_area :message %><br />
<%= f.submit 'Elküld' %>
<% end %>

Ha ezután megnyitjuk a domain.tld/kapcsolat url-t, akkor a formunkat kell látnunk. A validálás magyarítására most nem térnék ki, úgyhogy meg kell elégednünk az angolnyelvű hibaüzenetekkel.
Innentől már csak a mailerünket kell megcsinálni. Ehhez van generátor szerencsére:

./script/generate mailer contact_mailer send_form

A fenti parancs legenerál nekünk egy pár fájlt, de most csak a model és a view részével fogunk foglalkozni.
A model-ünket alakítsuk át az alábbiak szerint:

class ContactMailer < ActionMailer::Base
 
 
  def send_form(data,sent_at = Time.now)
    subject    'Contact form'
    recipients 'cimzett@email.com'
    from       'felado@email.com'
    sent_on    sent_at
 
    body       :data => data
  end
 
end

Ezután a view-ban a @data objectumban érjük majd el a szükséges adatokat. Innentől már csak meg kell hívnunk ezt a metódust és el is küldi a levelünket. Ezt a contact_controller.rb fájlban tesszük meg:

class ContactController < ApplicationController
 
  def index    
    if request.post?
      @contact = Contact.new(params[:contact])
      if @contact.valid?
        ContactMailer.deliver_send_form(@contact)
        flash[:notice]  = 'Üzenetét sikeresen továbbítottuk.'
      end   
    end  
  end
 
end

Viszont ahhoz hogy az emailt el is küldje a programunk, szükség lesz az ActionMailer konfigurációjára az environment.rb fájlunkban:

ActionMailer::Base.delivery_method = :sendmail
ActionMailer::Base.sendmail_settings = {
  :location => '/usr/lib/sendmail',
  :arguments => '-i -t'
}

A fenti leírás Rails 2-höz készült, de Rails 3-al is működnie kell amennyiben a mailert ahhoz megfelelően készítjük el.

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét