Ανάπτυξη ιστοτόπου σε περιβάλλον Debian/ruby on rails

Από Βικιβιβλία

Περιβάλλον εργασίας[επεξεργασία]

Για μια ελάχιστη λειτουργική εγκατάσταση του πλαισίου ανάπτυξης ιστοτόπων ruby on rails θα χρειαστούμε τα πακέτα

  • ruby (ψευδοπακέτο που δείχνει στην τελευταία σταθεσή έκδοση πχ το πακέτο ruby1.8
  • libzlib (zlib βιβλιοθήκες συμπίεσης Ruby.. αυτό δεν μου φαίνεται και αναγκαίο αρχικά..)
  • rdoc (Πρόγραμμα που παράγει εγχειρίδια από τα πηγαία αρχεία ruby)
  • irb κέλυφος διερμηνευτή ruby με διασύνδεση γραμμής εντολών
  • rails
  • rubygems
  • libmysql-ruby


#aptitude update
#aptitude upgrade
#aptitude install rubygems build-essential libmysql-ruby irb

Δες παραπάνω πληροφορίες για το πακέτοbuild-essential

Μην ξεχάσεις να εξάγεις την πλήρες διαδρομή προς το εκτελέσιμα πχ rails που θα εγκατασταθούν προσθέτωντας στο αρχείο /etc/bash.bashrc την γραμμή

export PATH=$PATH:/var/lib/gems/1.8/bin

Για να τεθεί σε ισχύ η νέα τιμή της μεταβλητής περιβάλλοντος PATH ξεκινήστε είτε ένα καινούργιο κέλυφος είτε καινούργιο τερματικό.

Κατόπιν χρησιμοποιούμε τον διαχειριστή πακέτων ruby(gems) με το όνομα gem για να εγκαταστήσουμε το rails . Υπάρχει και η δυνατότητα να εγκαταστήσουμε το rails σαν ξεχωριστό πακέτο με το aptitude ή το synaptic όμως υπάρχει μια αναφορά (στο τέλος) για πιθανά προβλήματα λόγω ποιό παλιάς έκδοσης στις debian αρχειοθήκες.

 #gem install rails --include-dependencies

Επίσης δημιουργήστε τονς σύνδεσμους

# su root
# ln /usr/bin/ruby1.8 /usr/bin/ruby 
# ln /usr/bin/irb1.8 /usr/bin/irb

Μερικά σενάρια που θα δούμε παρακάτω περιείχαν αναφορά στο ruby αλλά δεν είχε δημιουργηθεί ο σύνδεσμος.


Ελέγχουμε την εγκατάσταση εκτελώντας το irb.

# irb1.8
irb(main):001:0> require 'mysql'
=> true
rb(main):002:0> 3+5
=> 8
irb(main):003:0> 4*20
=> 80
irb(main):004:0> foo="bar"
=> "bar"
irb(main):005:0> foo.reverse
=> "rab"
irb(main):006:0> bar=40
=> 40
irb(main):007:0> bar.to_s.reverse
=> "04"
irb(main):008:0> exit



Ρύθμιση του apache[επεξεργασία]

Βασικές γνώσεις ruby[επεξεργασία]

Η Ruby ειναι μια πραγματικά αντικειμενοστραφής γλωσσα. Μπορειτε να χειριστειτε τα παντα σαν ενα αντικειμενο, και τα αποτελεσματα των εν λογω χειρισμών ειναι και αυτά αντικειμενα. Ωστοσο, πολλες γλωσσες ισχυρίζονται το ίδιο και συχνα εχουν διαφορετικη ερμηνεια για το τι σημαινει αντικειμενοστραφή γλώσσα και έχουν μια διαφορετικη ορολογια για τις σχετικές εννοιες.

Διερμηνευμένη γλώσσα[επεξεργασία]

Συναρτήσεις[επεξεργασία]

def greeting(message)
  puts message
end

greeting(“Hello from Ruby.”)

Όμως οι παρενθέσεις είναι προαιρετικές οπότε και η ακόλουθη κλήση είναι σωστή:

 greeting “Hello from Ruby.”

Αντικειμενοστραφής προγραμματισμός[επεξεργασία]

Αντικείνα και τάξεις[επεξεργασία]

Μεταβλητές αντικειμένου[επεξεργασία]

Μέθοδοι αντικειμένου[επεξεργασία]

Μέθοδοι πρόσβασης[επεξεργασία]

Ο συμβολισμός dot[επεξεργασία]

Λειτουργικότητα επιπέδου τάξης[επεξεργασία]

Μεταβλητές τάξης[επεξεργασία]

Οι μεταβλητές τάξης συνήθως τοποθετούνται στο σώμα της τάξης και αναγνωρίζονται από το πρόθεμά τους , @@ ("at" σύμβολο)


Μέθοδοι τάξης[επεξεργασία]

Μέθοδοι που συνδέονται με την τάξη και μπορούν να κληθούν πάνω στην τάξη ακόμα και η τάξη είναι κενή αντικειμένων. Πχ κάθε τάξη έχει την μέθοδο new έτσι ώστε η εντολή classname.new δημιουργεί ένα νέο αντικείμενο αυτής της τάξης.

Οι μέθοδοι τάξης χρησιμοποιούνται συνήθως για τη δημιουργία αντικειμένων με ορισμένα χαρακτηριστικά καθώς και για την συγκέντρωση στατιστικών χρήσης μιας τάξης. Ορίζονται όπως και οι μέθοδοι αντικεμένου με τις λέξεις def , end. Η μόνη διαφορά είναι ότι τα ονοματά τους έχουν το πρόθεμα self.

 #irb
 irb> class Book
 irb>  @@number_of_books = 0
 irb>  def self.count 
 irb>    @@number_of_books
 irb>  end
 irb>  def initialize
 irb>    @@number_of_books+=1 
 irb>  end
 irb>end
=>nil


Κληρονομικότητα[επεξεργασία]

Δημιουργία rail ιστοτόπου[επεξεργασία]

Αν ο DocumentRoot κατάλογος του apache είναι ο /var/www τότε προκειμένου να έχει πρόσβαση και δικαιώματα γραφής/ανάγνωσης ο apache και ruby σενάρια στους καταλόγους ενός ιστοτόπου αλλάζουμε των ιδιοκτήτη και την ομάδα του καταλόγου με την εντολή:

 # chown -R www-data:www-data /var/rails

Ας δημιουργήσουμε τώρα τον πρώτο μας δοκιμαστικό RoR ιστότοπο σαν χρήστης www-data.

 # cd /var/www/
 # su -m www-data
 # rails ftyaraki
Η δομή φακέλων νέου ιστοτόπου ftyaraki
Η δομή φακέλων νέου ιστοτόπου ftyaraki


Η τελευταία εντολη θα δημιουργήσει το πλαίσιο εργασίας του RoR ιστοτοπό μας με όνομα ftyaraki που περιλαμβάνει αρχικά τον κατάλο ftyaraki και τους υποκαταλόγους του.

Μετά δίνουμε την εντολή

# exit

και ξαναγινόμαστε ο χρήστης που είμασταν.

Ο ιστότοπος μας θέλουμε να είναι προσβάσιμος τοπικά με το όνομα http://local.ftyaraki και γιαυτό αλλάζουμε την πρώτη σειρά του αρχείου /etc/hosts να είναι η :

 127.0.0.1       localhost   local.ftyaraki 

Επίσης στον κατάλογο /etc/apache2/sites_available/ προσθέτουμε το αρχείο local.ftyaraki με τα περιεχόμενα :

<VirtualHost *>
   ServerName  local.ftyaraki
   DocumentRoot  /var/www/ftyaraki/public/
   <Directory /var/www/ftyaraki/public/>
               Options Indexes FollowSymLinks MultiViews
               AllowOverride None
               Order allow,deny
               allow from all
   </Directory> 
</VirtualHost>


Η εισαγωγική οθόνη μιας νεας εφαρμογής runy on rails
Η εισαγωγική οθόνη μιας νεας εφαρμογής runy on rails

και με τρέχοντα τον ίδιο κατάλογο δίνουμε την εντολή

 #a2ensite local.ftyraki
 #/etc/init.d/apache2 reload

Κατόπιν πρέπει δίνοντας σαν url το http://local.ftyaraki να μπορούμε να δούμε την οθόνη του διπλανού σχήματος.
Κατόπιν πρέπει να διορθώσουμε το αρχείο config/database.yml το οποίο περιέχει πληροφορίες που θα χρησιμοποιούν τα σενάρια ruby και ο κώδικας της ιστοσελίδας μας προκειμένου να έχουν πρόσβαση στη βάση δεδομένων του ιστοτόπου μας. Και ποιό συγκεκριμένα ο ιστότοπός μας θα έχει τρεις βάσεις όσο και τα περιβάλλοντα στο οποία θα δουλεύουμε τον ιστότοπό μας. Τα περιβάλλοντα αυτά είναι τα

  • ανάπτυξης (development)
  • δοκιμής (test)
  • παραγωγής (production)

Το καθένα από αυτά θα έχει και την δικιά του βάση δεδομένων.

Το επόμενο βήμα μας είναι να δημιουργήσουμε τις τρεις βάσεις μας.Θα το κάνουμε μέσα από τον πελάτη της γραμμής εντολών.

$ mysql -u root
mysql> CREATE DATABASE ftyaraki_development;
mysql> CREATE DATABASE ftyaraki_test;
mysql> CREATE DATABASE ftyariki_production;


Ας δημιουργήσουμε τώρα το βασικό μας μοντέλο , αυτό της ιστορίας (Story) που θα υποβάλουν οι επισκέπτες του ιστότοπου μας. Ένα ερωτημα που τίθεται είναι αν πρέπει να αλλάξουμε ταυτότητα χρήστη κατά την εκτέλεση της παρακάτω εντολής ή να παραμείνουμε διαχειριστής. Θα ακολουθήσουμε την οδό να έχουμε την ταυτότητα www-data

# su -m www-data 
#ruby script/generate model Story
     exists  app/models/
     exists  test/unit/
     exists  test/fixtures/
     create  app/models/story.rb
     create  test/unit/story_test.rb
     create  test/fixtures/stories.yml
     exists  db/migrate
     create  db/migrate/001_create_stories.rb
# chmod -R  755  *

Κατόπιν κάνουμε τις εξής αλλαγές στο αρχείο test/fixtures/stories.yml

# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html
one:
 id: 1
 name: Εναλλακτικός ιστότοπος ενημέρωσης .
 link: http://www.indy.gr
two:
 id: 2
 name: Κοινότητα ελλακ
 link: http://www.linux.gr

Κατόπιν κάνουμε τις παρακάτω αλλαγές στο αρχείο db/migrate/001_create_stories.rb

class CreateStories < ActiveRecord::Migration
  def self.up 
     create_table :stories, :force => true do |t|
       t.column :name, :string
       t.column :link, :string
     end
  end
  def self.down
    drop_table :stories
  end
end

Κατόπιν αλλάζουμε κατάλογο και εκτελούμε το migration αρχείο να για κατασκευαστεί ο πίνακάς μας.

# cd /var/www/ftyaraki
# rake db:migrate
(in /var/www/ftyaraki)
 == CreateStories: migrating ===================================================
 -- create_table(:stories, {:force=>true})
   -> 0.1066s
 == CreateStories: migrated (0.1068s) ==========================================


$ ruby script/console 
Loading development environment.
>> s = Story.new
=> #<Story:0xb7170ff4 @attributes={"name"=>nil, "link"=>nil}, @new_record=true>
>> s.name = 'my city guide'
=> "my city guide"
>> s.link = 'http://www.3kala.gr'
=> "http://www.3kala.gr"
>> s.save
=> true
>> 

Το ενδιαφέρον είναι ότι οι αλλαγές που κάναμε στην κονσόλα μας , μετά και την εκτέλεση της εντολής s.save έγιναν ορατές και στην βάση μας mysql κάτι που διαπιστώνουμε και με τις παρακάτω εντολές:

mysql -u  root -p
mysql> use ftyaraki_development ;
mysql> select * from stories ;
+----+---------------+---------------------+
| id | name          | link                |
+----+---------------+---------------------+
|  1 | my city guide | http://www.3kala.gr | 
+----+---------------+---------------------+
1 row in set (0.01 sec)

..και όπως βλέπουμε οι αλλαγές μας πέρασαν και στην mysql βάση μας. Αυτό αποτελεί έναν σταθμό στην εργασία μας αφού μας δείχνει την υποστήριξη active record που παρέχεται από το rails πλαίσιο (στην ουσία αυτό υλοποιείται από το άρθρωμα-module- active record , που είναι ένα σύνολο κλάσεων που μας παρέχουν αυτήν την ευκολία.)


Κατόπιν δημιούργουμε τον ελεγκτή που αντιστοιχεί στην βασική μας τάξη αντικειμένων καθώς και μια μέθοδο.

$ ruby script/generate controller Story index
     exists  app/controllers/
     exists  app/helpers/
     create  app/views/story
     exists  test/functional/
     create  app/controllers/story_controller.rb
     create  test/functional/story_controller_test.rb
     create  app/helpers/story_helper.rb
     create  app/views/story/index.rhtml

του rails)

Προς μελέτη[επεξεργασία]

  1. Πώς υλοποιείται σε ένα ruby on rail ιστότοπο το PRG (Post Redirect Get) σχεδιαστικό

πρότυπο;

  1. Πώς υποστηρίζεται tranasction based mysql βάση δεδομένων innodb;

Πηγές[επεξεργασία]

Εγχειρίδια-Οδηγίες[επεξεργασία]

Κοινότητα[επεξεργασία]