Σε αυτό το άρθρο θα μιλήσουμε για την rails. Η rails είναι ένα web framework φτιαγμένο με τη γλώσσα ruby και είναι ένα από τα μεγαλύτερα frameworks, αν όχι το μεγαλύτερο από άποψη κοινότητας, που υπάρχει αυτή τη στιγμή. Επειδή έχω παρατηρήσει ιδιαίτερο ενδιαφέρον στην Ελλάδα για τα CMS (joomla, wordpress, drupal) αποφάσισα να κάνω μια σειρά άρθρων για το πώς μπορούμε να φτιάξουμε με rails ένα απλό CMS, το οποίο θα εξυπηρετεί εύκολα τις ανάγκες απλών ιστοσελίδων. Η κατασκευή του CMS θα ξεκινήσει από το 3ο ή 4ο άρθρο. Σε αυτό το άρθρο θα παρουσιάσουμε την rails φτιάχνοντας κάτι γρήγορα και στο επόμενο θα πούμε κάποια θεωρητικά πράγματα που χρειάζεται να γνωρίζουμε όπως επίσης και πώς θα κάνουμε development με TDD (Test Driven Development).
Το παρακάτω είναι μια μικρή παρένθεση για τα άρθρα που θα ακολουθήσουν, αν βιάζεσαι να ξεκινήσεις πήγαινε παρακάτω, εκεί που λέει Ιστορική αναδρομή ή Εγκατάσταση της rails 3.
Ποιος χρειάζεται άλλο ένα open και κυρίως free source CMS και πόσο δύσκολο είναι;
Πιθανόν κανείς να μην το χρειάζεται, αν και εμείς βλέπουμε αρκετά πλεονεκτήματα στο να φτιάξουμε ένα CMS πέρα από το να μάθουμε rails. Ένα σημαντικό πλεονέκτημα είναι ο καλύτερος έλεγχος και το πιο απλό user interface από τα υπάρχοντα enterprise CMS. Είμαστε υπέρ του getting real, της δημιουργίας δηλαδή εφαρμογών που εστιάζουν να λύσουν συγκεκριμένα προβλήματα και όχι όλα τα προβλήματα του κόσμου.
Οπότε το CMS που θα φτιάξουμε δε θα είναι επιπέδου joomla κλπ. σε πολυπλοκότητα και σε δυνατότητες, άρα δε θα είναι και πολύ δύσκολο. Ένα παράδειγμα για το τι θα κάνει μπορείτε να δείτε εδώ (με κάποιες μικρές προσθήκες, άλλο interface και σε έκδοση rails 3). Ένα CMS σαν και αυτό, κάποιος που ξέρει rails μπορεί να το φτιάξει σε μια μέρα ή και σε λιγότερο (χωρίς το εικαστικό μέρος, μόνο σαν λειτουργικότητα).
Επίσης θεωρώ πολύ σημαντικό να ξεκινήσει κάποιος την ανάπτυξη σε rails μαθαίνοντας να γράφει tests για τον κώδικα του, υιοθετώντας από νωρίς πρακτικές όπως Τest Driven Development και Behavior Driven Development (η rails έχει πολύ ισχυρά εργαλεία για testing και δίνει ιδιαίτερη έμφαση στον τρόπο που γράφονται τα tests). To TDD αποτελεί μια μέθοδο, όπου γράφεις πρώτα τα tests και έπειτα τον κώδικα της εφαρμογής σου. Αυτή η μεθοδολογία μας προσφέρει μεγαλύτερη αυτοπεποίθηση για τον κώδικα που γράφουμε και μπορούμε έπειτα να προσθέτουμε κώδικα με μεγαλύτερη ευκολία και ασφάλεια. Για να μη μεγαλώσει πολύ το άρθρο αναφέροντας πόσο σημαντικά θεωρώ τα tests και τα οφέλη αυτής της πρακτικής, μπορείτε να δείτε εδώ ένα σχετικό video.
Κάτι τελευταίο που μπορεί να αναρωτιέστε είναι κατά πόσο χρειάζεται να ξέρετε ruby για να ασχοληθείτε με την rails. Σίγουρα όσο καλύτερα ξέρετε τόσο πιο άνετα θα νιώθετε, αυτό όμως δε σημαίνει ότι αν τώρα ξεκινάτε, θα πρέπει να μάθετε πρώτα ruby και μετά rails. Η γνώμη μου είναι ότι μπορεί κάποιος να ασχοληθεί με rails και να μάθει την ruby στην πορεία.
Ιστορική αναδρομή της ruby on rails
Η rails δημιουργήθηκε από τον David Heinemeier Hansson το 2004, ο οποίος αποφάσισε όμως να την κάνει release έναν χρόνο μετά για να γράψει το documentation. Η ruby on rails αναπτύχθηκε για τις ανάγκες της εταιρείας του της 37signals η οποία αναπτύσσει από τότε τα προϊόντα της σε ruby on rails. Σήμερα βγήκε η έκδοση 3 της rails και αποτελεί την ένωση δύο πολύ δυνατών web frameworks, του merb και της rails. Το merb ήταν ένα framework που αναπτύσσονταν από τον Yehuda Katz, ο οποίος είναι και μέλος της core team ανάπτυξης της jQuery και πλέον είναι ένας από τους βασικούς developers της rails 3.
Ξεκίνημα με την rails 3
Για να εγκαταστήσουμε την rails 3, έχοντας κάνει εγκατάσταση την ruby 1.9.2 από την προηγούμενη φορά, αρκεί να ανοίξουμε την γραμμή εντολών μας (στη rails χρησιμοποιείται ιδιαίτερα η command line - shell, είτε σε windows είτε σε unix / linux) και να γράψουμε την εντολή gem install rails --version 3.0.0 η οποία θα μας εγκαταστήσει όλα όσα χρειαζόμαστε για την rails.
Ας ξεκινήσουμε να φτιάξουμε κάτι! Για να δημιουργήσουμε μια νέα rails εφαρμογή που θα χρησιμοποιεί σαν βάση την mysql (η rails έχει σαν default την sqlite αλλά μπορούμε να χρησιμοποιήσουμε οποιαδήποτε βάση θέλουμε) γράφουμε rails new my_first_app -d mysql (σε περίπτωση σφαλμάτων, ελέγξτε ότι έχετε τα απαραίτητα δικαιώματα στον φάκελο που γράψατε την εντολή) και θα δείτε ότι δημιουργεί διάφορους φακέλους και αρχεία. Αυτή είναι η δομή που έχει κάθε rails application και θα εξετάσουμε σταδιακά μέσα από τα βοηθήματα τι είναι ο κάθε φάκελος. Προς το παρόν αρκεί να γνωρίζετε ότι κάθε rails application έχει την ίδια δομή φακέλων οπότε είναι πολύ εύκολο μόλις μάθετε που είναι τι, να πάρετε μια οποιαδήποτε άλλη εφαρμογή και να μπορέσετε γρήγορα να καταλάβετε πώς λειτουργεί. Επίσης τα πιο πολλά MVC frameworks έχουν παρόμοια δομή.
Για αρχή θα ορίσουμε κάποια gems που θα χρησιμοποιήσουμε με την rails application μας. Ανοίγουμε το αρχείο gemfile που βρίσκεται μέσα στο φάκελο της app μας. Εδώ τοποθετούνται όσα gems θα χρησιμοποιήσουμε στην application. Bλέπουμε ότι υπάρχει μια γραμμή που λέει source που αναφέρει από που θα κατεβάζει αυτόματα τα gems σε περίπτωση που δεν τα έχουμε. Παρακάτω χρησιμοποιούνται 2 gems, η rails 3 και η mysql2. Οι υπόλοιπες γραμμές που ξεκινούν με # είναι σχόλια. Γράφουμε gem 'jquery-rails' κάτω από τα υπάρχοντα gems για να χρησιμοποιήσουμε την jquery σαν default javascript framework library και gem 'nifty-generators' για να χρησιμοποιήσουμε κάποια layouts έτοιμα. Αυτά τα 2 gems είναι επιλογές μου, αν δε θέλετε μπορείτε να μην τα χρησιμοποιήσετε. Σε αυτή την περίπτωση σαν default δε θα οριστεί κάποιο layout και σαν default javascript framework θα χρησιμοποιηθεί η prototype με την scriptaculous. Έπειτα γράφουμε στη γραμμή εντολών bundle install για να εγκαταστήσουμε τα απαραίτητα gems και να τα χρησιμοποιεί η application μας. Στη συνέχεια γράφουμε rails g jquery:install και ορίζεται η jquery σαν default javascript library.
Έπειτα ανοίγουμε το αρχείο config/database.yml για να δώσουμε τις απαραίτητες ρυθμίσεις για την βάση. H rails έχει 3 περιβάλλοντα ανάπτυξης (development για ανάπτυξη της εφαρμογής, test για testing και production για production mode) και χρησιμοποιεί διαφορετικές βάσεις για το καθένα (μπορούμε να χρησιμοποιήσουμε και την ίδια βάση για όλα αλλά φυσικά δεν προτείνεται). Γράφουμε δίπλα από το database: το όνομα της βάσης μας και δίπλα από το username:, password: τα στοιχεία του χρήστη της βάσης, σώζουμε και κλείνουμε το αρχείο. Για να δημιουργήσουμε τις βάσεις, αρκεί να γράψουμε στην γραμμή εντολών είτε rake db:create για δημιουργία της development & της test βάσης ή rake db:create:all για δημιουργία όλων των βάσεων (η εντολή λειτουργεί όταν βρισκόμαστε στο φάκελο της rails application μας).
Για να τρέξουμε μια rails application υπάρχουν διάφοροι τρόποι, με γνωστότερο, για production, τη χρήση του phusion passenger στον οποίο είναι πολύ απλό ρυθμίζοντας τα virtual hosts του server μας να ανεβάσουμε την εφαρμογή μας (σε mac υπάρχει έτοιμη εφαρμογή που κάνει deploy αμέσως). Επειδή όμως αυτό είναι κομμάτι για ένα άλλο άρθρο, θα αναφέρω έναν άλλο τρόπο. Πατώντας rails s ξεκινάμε την εφαρμογή μας με χρήση του Webrick, ενός web server γραμμένου σε ruby. Ένας καλύτερος τρόπος είναι η εγκατάσταση ενός άλλου web server, του mongrel. Για εγκατάσταση του mongrel, επειδή προς το παρόν είναι ακόμα σε beta, πρέπει να γράψουμε gem install mongrel --pre, έπειτα να βάλουμε στο gemfile τη γραμμή gem 'mongrel', '1.2.0.pre2' και στη συνέχεια να γράψουμε πάλι bundle install. Έπειτα τρέχουμε πάλι την εντολή rails s και ξεκινά η application μας. Η εγκατάσταση του mongrel θα αλλάξει μόλις βγει η κανονική έκδοση για rails 3 και δε θα χρειάζεται να ορίσουμε ειδική έκδοση.
Γράφοντας σε έναν browser http://localhost:3000 θα εμφανιστεί η default σελίδα μιας rails εφαρμογής. Πατώντας το about your application's environment βλέπουμε διάφορες πληροφορίες για τις εκδόσεις ruby/rails που χρησιμοποιούμε. Σβήνουμε τη default σελίδα σβήνοντας το αρχείο index.html που βρίσκεται στον φάκελο public. Ο φάκελος public αποτελεί τον φάκελο που βλέπει ο έξω κόσμος και χρησιμοποιεί ο server σαν τη βάση της application μας. Για να εφαρμόσουμε το layout του gem nifty-generators θα γράψουμε την εντολή rails generate nifty:layout (ή rails g nifty:layout) και έπειτα Y(yes) σε οποιαδήποτε conficts παρουσιαστούν (επειδή αντικαθιστά ένα αρχείο για να βάλει το δικό του layout). Αυτό το βήμα είναι προαιρετικό, το έβαλα για να ομορφύνουμε λίγο το interface μας.
Στη συνέχεια θα φτιάξουμε μια τυπική εφαρμογή. Γράφουμε την εντολή rails g nifty:scaffold Product name:string description:text quantity:integer price:integer ή αν δε χρησιμοποιείτε τους nifty-generators παραλείψτε το nifty:. Έπειτα για να δημιουργήσουμε τα απαραίτητα tables στη βάση γράφουμε rake db:migrate.
H rails χρησιμοποιεί ένα δικό της τρόπο για να ελέγχει τις αλλαγές που γίνονται στη βάση, τα migrations. Με τα migrations μας δίνονται δυνατότητες version control, δηλαδή να πάμε πίσω σε προηγούμενες εκδόσεις, να μεταφέρουμε εύκολα και γρήγορα τη βάση μας κλπ.Όλα αυτά θα τα εξετάσουμε πιο αναλυτικά κάποια άλλη στιγμή.
Πηγαίνουμε τώρα στην εφαρμογή μας, πατώντας http://localhost:3000/products σε έναν browser και βλέπουμε μια τυπική φόρμα δημιουργίας προϊόντων με τα πεδία που χρησιμοποιήσαμε στην εντολή scaffold.
Τέλος άρθρου
Στο παρόν άρθρο είδαμε πόσο εύκολα και απλά δημιουργήσαμε μια απλή html5 web εφαρμογή με τη χρήση του scaffold. Το scaffold είναι ένα χρήσιμο εργαλείο για να δείξουμε βασικές αρχές και έννοιες στην rails. Δε χρησιμοποιείται σε production τόσο πολύ εκτός αν θέλουμε να φτιάξουμε κάτι το οποίο θα ταιριάζει με αυτό που το scaffold παράγει. Θα εξετάσουμε τον κώδικα αναλυτικά σε επόμενο άρθρο μας. Προς το παρόν ίσως σας φαίνονται όλα κάπως μαγικά (και είναι!), αλλά μόλις εξηγήσουμε τι κάνει και πώς δημιουργείται αυτός ο κώδικας θα αρχίσουν να φαίνονται όλα πιο οικεία και θα αντιληφθείτε τα πλεονεκτήματα ενός framework. Η rails δε φτιάχνει κώδικα τυποποιημένο. Απλά μας βοηθάει να αναπαράγουμε και να παραμετροποιήσουμε διάφορες λύσεις σε κλασικά προβλήματα και πάνω σε αυτές τις λύσεις να χτίσουμε τις δικές μας ιδέες και εφαρμογές.