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.