🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.ruby
Article #1006

Re: serwer WWW

#1006
From: Jaroslaw Zabiello
Date: Fri, 28 Mar 2008 04:59
160 lines
6199 bytes
Dnia 27-03-2008 o 09:43:29 Kazimierz Trewiń <ftrtuilhjk@hjkigj57g6fh.pl>  
napisał(a):

> edek pisze:
>> Spróbuj może ściągnąć sobie mongrela na windowsy i zobaczyć, czy nie da  
>> się go w prosty sposób przerobić na portable.
>>  Jejku, ale Ty niepotrzebnie kombinujesz.
>
> Webrick ma jakies przyklady wiec od niego zaczynalem.
> niestety dalej utknalem. nie wiem jak wziasc parametry
> np /index?a=test&b=tt

Do bani ten Webrick. Zapomnij. Lepiej użyj porządnego, prostego i  
wydajnego frameworka - Merb (http://merbivore.com/, instalacja: gem  
install merb) Potrafi tworzyć projekty na 3 sposoby.

$ merb-gen app full_wypas
$ merb-gen app uproszczony -flat
$ merb-gen app minimalny --very-flat

Zwłaszcza ten ostatni jest ciekawy, bo jest nawet prostszy od tego  
przykładu z Webrickiem. Serwer uruchamiasz przez: merb -I minimalny.rb  
(zobacz merb --help  po więcej parametrów). Domyślnie serwer podnosi się  
na http://localhost:4000.

Cały kod serwera streszcza się do

Merb::Router.prepare do |r|
   r.match('/').to(:controller => 'minimalny', :action =>'index')
end

class Minimalny < Merb::Controller
   def index
     "Dostałem parametry: #{params.inspect}"
   end
end

Merb::Config.use { |c|
   c[:framework]           = {},
   c[:session_store]       = 'none',
   c[:exception_details]   = true
}

Wejście na http://localhost:4000/?a=test&b=tt wyświetli
Dostałem parametry: {"a"=>"test", "b"=>"tt", "action"=>"index",  
"controller"=>"minimalny"}

> mysle, ze gdyby mi sie udalo to zrobic + jakas prosta baza danych chocby  
> i plikowa to by wystarczylo.

SQLite (http://www.sqlite.org/) będzie tu doskonały, bo to baza plikowa  
ale z pełnym dostępem do SQL i jest bardzo szybka. Musisz tylko  
doinstalować obsługę SQlite dla Rubiego:

sudo gem install sqlite3-ruby

OK. Teraz pokaże ci krok po kroku jak szybko zmontować prostą aplikację.

Wpierw tworzymy projekt (w pełnej wersji, bo potem łatwiej z tym pracować)

$ merb-gen app myproj

Zostanie stworzony katalog myproj z różnymi plikami i katalogami w środku.  
To jest szkielet aplikacji. I tak jest prostszy od tego co generują Rails.  
Aby uaktywnić obsługę bazy danych, wejdź do pliku config/init.rb i  
odkomentuj jedną linijkę, tak aby było:

use_orm :sequel

Tym samym Merb będzie pracował z  Sequel (info:  
http://code.google.com/p/ruby-sequel/). Znacznie uprości to pracę z bazą  
SQLite i ułatwi ci ewentualne przepięcie aplikacji ze SQLite do MySQL czy  
innej bazy.

Teraz przejdź do konsoli i odpal w katalogu projektu polecenie/skrypt

merb-gen

Merb już wie, że chcesz używać bazy, więc automatycznie stworzy ci teraz  
plik konfiguracyjny config/database.sample.yml. Zmień jego nazwę na  
database.yml. Domyślnie tworzone są tam ustawienia dla MySQL. Aby użyć  
SQLite, zmień go na:

---
:development: &defaults
   :adapter: sqlite3
   :database: baza.db
   :encoding: utf8

:test:
   <<: *defaults
   :database: baza-testowa.db

:production:
   <<: *defaults

Teraz stworzmy jakiś przykładowy model danych z użytkownikami i kontroler  
do ich zarządzania.

merb-gen resource user

Przejdź do pliku schema/migrations/001_user.rb  i zmień go na

class UserMigration < Sequel::Migration
   def up
     create_table :users do
       varchar :name, :unique => true
       primary_key :id
     end
   end
   def down
     execute "DROP TABLE users"
   end
end

(więcej o migracjach http://code.google.com/p/ruby-sequel/wiki/Migrations)

Będąc w katalogu projektu, odpal polecenie:

rake sequel:db:migrate

Zostanie stworzona baza (plik: baza.db) oraz tabela users. No to teraz  
trochę się pobawmy interaktywną konsolą aby dodać jakieś dane do bazy.
$ merb -i
  ~ Loaded DEVELOPMENT Environment...
  ~ loading gem 'merb_sequel' from  ...
  ~ Connecting to the 'baza.db' database on '' using 'sqlite' ...
  ~ Compiling routes...
  ~ Using 'share-nothing' cookie sessions (4kb limit per client)
>> User.create :name => 'Jarek'
=> #<User @values={:name=>"Jarek", :id=>1}>
>> User.create :name => 'Ewa'
=> #<User @values={:name=>"Ewa", :id=>2}>
>> User.all
=> [#<User @values={:name=>"Jarek", :id=>1}>, #<User  
@values={:name=>"Ewa", :id=>2}>]

OK. Ostatni krok. Otwórz plik app/views/users/index.html.erb i wstaw:

<p>W bazie mam użytkowników o imionach:</h1>
<% for user in @users %>
   <p><%= user.name %></p>
<% end %>

To wszystko! Odpal serwer z aplikacją za pomocą komendy: merb
(więcej: merb --help) i otwórz stronę http://localhost:4000/users


> Potem jesli bedzie dobrze dzialac nawet mozna skompilowac to jako  
> program w C.

Nie można. To akurat jest kompletnie bez sensu. Nie ma potrzeby żadnej  
kompilacji, wręcz to jest niemożliwe, bo Ruby jest interpreterem. Nie wiem  
po co ci to. Jeśli już chcesz zapakować wszystko do jednego pliku to  
lepiej, stworzyć javowy *.jar i odpalać to przez java -jar myproj.jar. Ale  
to wymaga użycia JRuby.

-- 
Jarosław Zabiełło
http://blog.zabiello.com
Technical Details
Message-ID: <op.t8pmt1w2yvsyti@macbook-pro-15-zbiru.local>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
References: <fsapgk$o6c$1@nemesis.news.neostrada.pl> <fsda7c$bnp$1@inews.gazeta.pl> <fsdbb1$fk3$1@atlantis.news.neostrada.pl> <op.t8mjo1p1r2rg33@jzmbp.westglobal.com> <fsfhvq$okf$1@atlantis.news.neostrada.pl> <fsfm3d$mqr$1@inews.gazeta.pl> <fsfmnc$ae7$1@atlantis.news.neostrada.pl> <fsfonf$1hu$1@inews.gazeta.pl> <fsfq17$kp7$1@atlantis.news.neostrada.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail
From: "Jaroslaw Zabiello" <hipertracker@gmail.com>
Newsgroups: pl.comp.lang.ruby
Subject: Re: serwer WWW
Date: Fri, 28 Mar 2008 04:59:31 -0000
Organization: http://zabiello.com
Lines: 160
Message-ID: <op.t8pmt1w2yvsyti@macbook-pro-15-zbiru.local>
References: <fsapgk$o6c$1@nemesis.news.neostrada.pl> <fsda7c$bnp$1@inews.gazeta.pl> <fsdbb1$fk3$1@atlantis.news.neostrada.pl> <op.t8mjo1p1r2rg33@jzmbp.westglobal.com> <fsfhvq$okf$1@atlantis.news.neostrada.pl> <fsfm3d$mqr$1@inews.gazeta.pl> <fsfmnc$ae7$1@atlantis.news.neostrada.pl> <fsfonf$1hu$1@inews.gazeta.pl> <fsfq17$kp7$1@atlantis.news.neostrada.pl>
NNTP-Posting-Host: 89.127.179.95
Mime-Version: 1.0
X-Trace: inews.gazeta.pl 1206680393 21514 89.127.179.95 (28 Mar 2008 04:59:53 GMT)
X-Complaints-To: usenet@agora.pl
NNTP-Posting-Date: Fri, 28 Mar 2008 04:59:53 +0000 (UTC)
X-User: hipertracker
User-Agent: Opera Mail/9.26 (MacIntel)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit