kaj zna ruby::na::rails narediti za vas

  • sprogramira program v ruby ali objective-c
  • naredi kičasto spletišče namesto vas
  • svetuje pri razvoju in nameščanju Rails spletišč
  • sestavi namizno aplikacijo v Cocoa
  • izdela kičasto iPhone aplikacijo
  • razmišlja namesto vas, kadar rabite tehnološke možgane

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>&nbsp;
  <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.