blog@
dan: 094, teden: 14 [04.04.07]
Blog@ je zelo preprost spletni “čet”, ki sem ga sestavil za spletišče večniprijatelj.org, kjer si lahko ogledaš delujočo verzijo. Ker je izdelan kot komponenta, ga je možno prilepiti na katero koli stran.
Na kratko bom pokazal, kako enostavno je izdelati takšen enostaven klepet v razvojnem okolju Rails. Primer sem izvajal na linux podlagi, prepričan sem, da na enak način dosežete rezultate tudi v window$ okolju.
(Pogoji za izdelavo: zadnja verzija ruby interpreterja, rails razvojnega ogrodja in delujoča podatkovna baza, npr. MySQL ali PostgreSQL)
Projekt sem poimenoval Klepetnik. Izdelal sem ga s preprostimi AJAX poizvedbami. Omogoča preprosto “četanje” na vašem rails spletišču.
Za lenobno premišljujoče je celotna koda primera dosegljiva v ZIP ali GZIP arhivu. Vsebuje celoten rails projekt. Samo razpakiraš, nastaviš podatkovno bazo in poženeš.
S preprostim ukazom v ukazni vrstici kreiramo aplikacijsko strukturo.
zilgremp:~/rubist> rails Klepetnik
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create components
create db
create doc
create lib
create lib/tasks
create log
create public/images
create public/javascripts
create public/stylesheets
create script/performance
create script/process
create test/fixtures
create test/functional
create test/integration
create test/mocks/development
create test/mocks/test
create test/unit
create vendor
create vendor/plugins
create tmp/sessions
create tmp/sockets
create tmp/cache
create tmp/pids
create Rakefile
create README
create app/controllers/application.rb
create app/helpers/application_helper.rb
create test/test_helper.rb
create config/database.yml
create config/routes.rb
create public/.htaccess
create config/boot.rb
create config/environment.rb
create config/environments/production.rb
create config/environments/development.rb
create config/environments/test.rb
create script/about
create script/breakpointer
create script/console
create script/destroy
create script/generate
create script/performance/benchmarker
create script/performance/profiler
create script/process/reaper
create script/process/spawner
create script/process/inspector
create script/runner
create script/server
create script/plugin
create public/dispatch.rb
create public/dispatch.cgi
create public/dispatch.fcgi
create public/404.html
create public/500.html
create public/index.html
create public/favicon.ico
create public/robots.txt
create public/images/rails.png
create public/javascripts/prototype.js
create public/javascripts/effects.js
create public/javascripts/dragdrop.js
create public/javascripts/controls.js
create public/javascripts/application.js
create doc/README_FOR_APP
create log/server.log
create log/production.log
create log/development.log
create log/test.log
Generator je kreiral aplikacijsko ogrodje. Naslednji korak je priprava podatkovne baze. S primernim orodjem pripravimo bazo. Uporabil sem phpMyAdmin za dostop do MySQL in kreiral bazo z imenom “klepetnik”, ki je dostopna z uporabniškim imenom “root” in praznim geslom.
CREATE DATABASE `klepetnik` ;Rails aplikaciji sedaj moram samo povedati, kje se nahaja baza. V ta namen odprem datoteko config/database.yml in nastavim dostopne podatke.
zilgremp:~/rubist> cd Klepetnik/
zilgremp:~/rubist/Klepetnik> joe config/database.yml
database.yml zgleda potem takole:
development:
adapter: mysql
database: klepetnik
username: root
password:
host: localhost
test:
adapter: mysql
database: klepetnik
username: root
password:
host: localhost
production:
adapter: mysql
database: klepetnik
username: root
password:
host: localhost
Sedaj imam vse pripravljeno za delo. Ker rad uporabljam napredne možnosti rails generatorjev kode, ne grem takoj ustvarjat strukture tabel v phpMyAdmin, ampak si jih kar takoj pripravim v migracijo, ki se nahajajo v mapi “db/migrate/”.
zilgremp:~/rubist/Klepetnik> script/generate migration tabele
create db/migrate
create db/migrate/001_tabele.rb
Odprem “db/migrate/001_tabele.rb”, ki izgleda tako.
class Tabele < ActiveRecord::Migration
def self.up
create_table :klepets, :force => true do |t|
t.column :content, :string, :null => false
t.column :author, :string, :null => false
t.column :created_at, :datetime
end
end
def self.down
drop_table :klepets
end
Definicija migracije je le “class” ali razredni objekt, ki razširja ActiveRecord::Migration nadrazred. Ruby je namreč čisti objektni jezik, brez primitivnih tipov kot jih pozna java. Uporablja prepoznavanje pluralizacije imen. Zato je klepet postal klepets – v angleščini ima množina s na koncu besede.
Nadaljujem z ukazom
zilgremp:~/rubist/Klepetnik> rake db:migrate
(in /home/zarni/rubist/Klepetnik)
== Tabele: migrating ==========================================================
-- create_table(:klepets, {:force=>true})
-> 0.0398s
== Tabele: migrated (0.0403s) =================================================
in tako preprosto kreiram tabele v bazi.
Z ukazom
rake db:migrate VERSION=x
kjer x zamenjam z verzijo migracije lahko poljubno izbiram katera se naloži v bazo.
Ogrodje deluje po načelih MVC – model, view, controller. Z generatorji “model” in “controller” pripravim aplikacijsko strukturo. Rails zame pripravi tudi testno ogrodje. Vendar ga sedaj ne bom uporabljal.
zilgremp:~/rubist/Klepetnik> script/generate model Klepet
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/klepetnik.rb
create test/unit/klepetnik_test.rb
create test/fixtures/klepetniks.yml
exists db/migrate
create db/migrate/002_create_klepetniks.rb
zilgremp:~/rubist/Klepetnik> script/generate controller Klepet
exists app/controllers/
exists app/helpers/
create app/views/klepet
exists test/functional/
create app/controllers/klepet_controller.rb
create test/functional/klepet_controller_test.rb
create app/helpers/klepet_helper.rb
Odprem klepet_controller.rb in ga pripravim takole:
class KlepetController < ApplicationController
layout 'default'
def index
list
render :action => 'list'
end
#doda klepet in shrani v bazo
def dodajklepet
if request.xhr?
@klepet = Klepet.new
@klepet.content = params[:klepet][:content]
@klepet.author = params[:klepet][:author]
@klepet.author = "nekdo" if @klepet.author.blank?
if @klepet.save
flash[:notice] = 'Klepet je uspešno shranjen.'
end
@klepetanje = Klepet.latest
render :update do |page|
page.replace_html 'klepetflow', :partial => 'klepet/klepetflow', :object => @klepetanje
end
end
end
#prikaže seznam
def klepetflow
if request.xhr?
@klepetanje = Klepet.latest
render :update do |page|
page.replace_html 'klepetflow', :partial => 'klepet/klepetflow', :object => @klepetanje
end
end
end
def list
@klepet_pages, @klepetanje = paginate :klepets, :per_page => 13, :order => 'created_at desc'
end
def destroy
Klepet.find(params[:id]).destroy
redirect_to :action => 'list'
end
end
Sedaj mi preostane le še “view”. Tega pripravim v “app/views/klepet”.
“app/views/klepet/_form.rhtml”
<%= error_messages_for 'klepet' %>
Klepetalec : <%= text_field 'klepet', 'author', :size => 14, :style => "border: 0; border-bottom:1px solid gray;" %><br/>
<span style="margin-top:5px;"><%= text_field 'klepet', 'content', :size => 23 %></span>
“app/views/klepet/_klepetflow.rhtml”
<% for k in @klepetanje %>
<span style="font-weight: italic; font-size:10px;">[<%=h k.author%>]</span>
<span><%=h k.content%></span><br/>
<% end %>
“app/views/klepet/_klepettool.rhtml”
<div id="dodajklepet">
<span style="font-size:12px; color: white; font-weight:bold;">Klepetaj!</span>
<%= form_remote_tag :url => {:controller => 'klepet', :action => 'dodajklepet'},
:loading => "$('klepet_content').value = ''; $('klepet_content').focus()",
:html => {'id' => 'dodajklepet_form'} %>
<%= render_partial "klepet/form" %>
<input type="submit" value="Add" style="display:none"/>
</form>
<%= link_to ("Oglej si vse"), :controller => 'klepet', :action => "list"%>
<div id="klepetflow"></div>
<%= periodically_call_remote :url => { :controller => 'klepet', :action => 'klepetflow' },
:frequency => 3,
:complete => visual_effect(:highlight, "klepet_content", {:duration => 2, :startcolor => "'#ffffff'", :endcolor => "'#5 %>
</div>
Sedaj si pripravim le še en osnovni “layout”, ki bo poskrbel, da bo klepet prikazan.
Pripravim si “app/views/layouts/default.rb”.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
<title>Klepetnik</title>
</head>
<body>
<div id="content">
<%=render :partial => 'klepet/klepettool'%>
<%= yield %>
</div>
</body>
</html>
Ker so klici klepetnika le AJAX poizvedbe, potrebujem še en “dummy” kontroler, da prikažem osnovno stran aplikacije.
zilgremp:~/rubist/Klepetnik> script/generate controller Welcome
exists app/controllers/
exists app/helpers/
create app/views/welcome
exists test/functional/
create app/controllers/welcome_controller.rb
create test/functional/welcome_controller_test.rb
create app/helpers/welcome_helper.rb
V app/views/welcome dodam datoteko index.rhtml z vsebino
Tole je demonstracija klepetnika.
V istoimenski kontroler pa nastavim skupen layout. app/controllers/welcome_controller.rb
class WelcomeController < ApplicationController
layout 'default'
end
Pobrisati moram še datoteko public/index.html, drugače se le ta prikazuje kot vstopna/začetna stran spletišča. Dostope usmerim na welcome kontroler v datoteki “config/routes.rb”, kjer lahko poljubno nastavljam poti do kontrolerjev:
ActionController::Routing::Routes.draw do |map|
map.connect '', :controller => "welcome"
map.connect ':controller/service.wsdl', :action => 'wsdl'
map.connect ':controller/:action/:id.:format'
map.connect ':controller/:action/:id'
end
Aplikacijo poženem takole
zilgremp:~/rubist/Klepetnik> script/server
...
Usmerim spletni brskalnik firefox na naslov http://localhost:3000 in to je to.



Komentarji so isključeni za ta članek.