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.
Harder
Profil