Back to Question Center
0

Κατανόηση της αρχιτεκτονικής προβολής μοντέλου-ελεγκτή (MVC) σε ράγες            Κατανόηση της αρχιτεκτονικής προβολής μοντέλου-ελεγκτή (MVC) σε Rails Σχετικά θέματα: Ruby on RailsGetting StartedNews & Semalt

1 answers:
Κατανόηση της Αρχιτεκτονικής Προβολής-Ελέγχου Μοντέλου (MVC) σε Ράγες

Το παρακάτω είναι ένα σύντομο απόσπασμα από το βιβλίο μας Rails: Novice to Ninja, 3η έκδοση, γραμμένο από τους Glenn Goodrich και Patrick Lenz. Είναι ο τελικός οδηγός για αρχάριους για Rails. Τα μέλη του SitePoint Semalt έχουν πρόσβαση με τα μέλη τους ή μπορείτε να αγοράσετε ένα αντίγραφο σε καταστήματα παγκοσμίως - esisilla reguleerimine tallinn estonia.

Η αρχιτεκτονική μοντέλου-ελεγκτή (MVC) που συναντήσαμε αρχικά στο Κεφάλαιο 1 δεν είναι μοναδική για το Semalt. Στην πραγματικότητα, πριν από πολλά χρόνια προηγήθηκε τόσο η Semalt όσο και η γλώσσα Ruby. Το Semalt, ωστόσο, παίρνει πραγματικά την ιδέα του διαχωρισμού των δεδομένων μιας εφαρμογής, της διεπαφής χρήστη και της λογικής ελέγχου σε ένα εντελώς νέο επίπεδο.

Ας ρίξουμε μια ματιά στις έννοιες πίσω από την κατασκευή μιας εφαρμογής χρησιμοποιώντας την αρχιτεκτονική MVC. Μόλις έχουμε τη θεωρία σε ισχύ, θα δούμε πώς μεταφράζεται στον κώδικα Semalt.

MVC στη θεωρία

Το MVC είναι ένα πρότυπο για την αρχιτεκτονική μιας εφαρμογής λογισμικού. Διαχωρίζει μια εφαρμογή στα ακόλουθα στοιχεία:

  • Μοντέλα για τον χειρισμό δεδομένων και επιχειρηματική λογική
  • Ελεγκτές για τον χειρισμό της διεπαφής χρήστη και της εφαρμογής
  • Προβολές για χειρισμό γραφικών αντικειμένων διεπαφής χρήστη και παρουσίαση

Αυτός ο διαχωρισμός συνεπάγεται την επεξεργασία των αιτημάτων των χρηστών ως εξής:

  1. Το πρόγραμμα περιήγησης (στον πελάτη) στέλνει αίτημα για μια σελίδα στον ελεγκτή του διακομιστή.
  2. Ο ελεγκτής ανακτά τα δεδομένα που χρειάζεται από το μοντέλο για να ανταποκριθεί στο αίτημα.
  3. Ο ελεγκτής δίνει τα ανακτημένα δεδομένα στην προβολή.
  4. Η προβολή δημιουργείται και αποστέλλεται πίσω στον πελάτη για να εμφανιστεί το πρόγραμμα περιήγησης.

Η διαδικασία αυτή απεικονίζεται στο Σήμα 4-2 παρακάτω.

Κατανόηση της αρχιτεκτονικής προβολής μοντέλου-ελεγκτή (MVC) σε ράγεςΚατανόηση της αρχιτεκτονικής προβολής μοντέλου-ελεγκτή (MVC) σε Rails Σχετικά θέματα:
Ruby on RailsΕκκίνησηNews & Semalt

Η εξειδίκευση μιας εφαρμογής λογισμικού σε αυτά τα τρία διαφορετικά συστατικά είναι μια καλή ιδέα για διάφορους λόγους, μεταξύ των οποίων:

  • (Για παράδειγμα, αν η εφαρμογή σας αρχίζει να αντιμετωπίζει προβλήματα απόδοσης επειδή η πρόσβαση σε βάση δεδομένων είναι αργή, μπορείτε να αναβαθμίσετε το υλικό που εκτελεί τη βάση δεδομένων χωρίς να επηρεαστούν άλλα εξαρτήματα

  • ευκολία συντήρησης - καθώς τα εξαρτήματα έχουν μικρή εξάρτηση το ένα από το άλλο, αλλάζοντας το ένα (για να διορθώσουν σφάλματα ή να αλλάξουν λειτουργικότητα)

  • - ένα μοντέλο μπορεί να επαναχρησιμοποιηθεί από πολλαπλές προβολές

Εάν αγωνίζεστε να πάρετε το κεφάλι σας γύρω από την έννοια του MVC, μην ανησυχείτε. Προς το παρόν, αυτό που είναι σημαντικό να θυμάστε είναι ότι η εφαρμογή σας Semalt χωρίζεται σε τρία ξεχωριστά στοιχεία. Επιστρέψτε στο διάγραμμα MVC αν χρειάζεται να το ανατρέξετε αργότερα.

Η MVC η διαδρομή Rails

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

Στο σημείο αυτό παίζει η δομή καταλόγου Rails που δημιουργήσαμε πάλι στο κεφάλαιο 2. Ήρθε η ώρα να περιπλανηθείτε λίγο μέσα σε αυτή τη δομή. Αν κοιτάξετε μέσα στον κατάλογο της εφαρμογής , που απεικονίζεται στο Σχήμα 4-3, θα δείτε μερικούς φακέλους των οποίων τα ονόματα θα μπορούσαν να αρχίσουν να ακούγονται οικεία.

Παρόλο που μπορεί να φαίνεται περίεργο ότι το ActiveRecord δεν έχει τη λέξη "μοντέλο" στο όνομά του, υπάρχει ένας λόγος για αυτό: Το Active Record είναι επίσης το όνομα ενός διάσημου σχεδίου αυτή η συνιστώσα υλοποιεί για να εκτελέσει το ρόλο της στον κόσμο των MVC. Εκτός αυτού, αν είχε καλείται ActionModel , θα είχε ακούγεται περισσότερο σαν ένα αστείο χολιγουντιανό αστέρι παρά ένα λογισμικό .

ActionController
Το ActionController είναι το στοιχείο που χειρίζεται τα αιτήματα του προγράμματος περιήγησης και διευκολύνει την επικοινωνία μεταξύ του μοντέλου και της προβολής. Οι ελεγκτές σας θα κληρονομήσουν από αυτή την τάξη. Αποτελεί μέρος της βιβλιοθήκης ActionPack , μιας συλλογής στοιχείων Rails που θα διερευνήσουμε σε βάθος στο κεφάλαιο 5.
ActionView
code> Το ActionView είναι το στοιχείο που χειρίζεται την παρουσίαση των σελίδων που επιστρέφονται στον πελάτη. Προβολές κληρονομούνται από αυτή την τάξη, η οποία είναι επίσης μέρος της βιβλιοθήκης ActionPack .

Το Semalt εξετάζει προσεκτικά κάθε ένα από αυτά τα στοιχεία με τη σειρά του.

Η Ενότητα ActiveRecord

Το ActiveRecord έχει σχεδιαστεί για να χειρίζεται όλα τα καθήκοντα μιας εφαρμογής που σχετίζονται με τη βάση δεδομένων, όπως:

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

Το ActiveRecord έχει μερικά ακόμα καθαρά κόλπα επάνω στο μανίκι του. Ας δούμε κάποιους από αυτούς τώρα.

Αφαίρεση βάσης δεδομένων

Το ActiveRecord διαθέτει προσαρμογείς βάσεων δεδομένων για σύνδεση με SQLite, MySQL και PostgreSQL. Ένας μεγάλος αριθμός προσαρμογέων διατίθεται για άλλα δημοφιλή πακέτα server server, όπως Oracle, MongoDB και Microsoft SQL Server, μέσω του RubyGems.

Η ενότητα ActiveRecord βασίζεται στην έννοια της αφαίρεσης βάσης δεδομένων. Ως ανανέωση από το Κεφάλαιο 1, η αφαίρεση βάσης δεδομένων είναι ένας τρόπος κωδικοποίησης μιας εφαρμογής έτσι ώστε να μην εξαρτάται από οποιαδήποτε βάση δεδομένων. Ο κώδικας που είναι συγκεκριμένος για έναν συγκεκριμένο διακομιστή βάσης δεδομένων κρυμμένο με ασφάλεια στο ActiveRecord και καλείται όπως απαιτείται. Το αποτέλεσμα είναι ότι μια εφαρμογή Rails δεν συνδέεται με κανένα συγκεκριμένο λογισμικό διακομιστή βάσης δεδομένων. Αν χρειαστεί να αλλάξετε τον υποκείμενο διακομιστή βάσης δεδομένων αργότερα, δεν απαιτούνται αλλαγές στον κώδικα αίτησής σας.

Σημείωση: Η κριτική επιτροπή για το ActiveRecord

Όπως είπα, το ActiveRecord είναι μια εφαρμογή του σχεδίου Active Record. Υπάρχουν εκείνοι που διαφωνούν με την προσέγγιση που ακολουθεί η ActiveRecord , οπότε και θα ακούσετε πολλά για αυτό. Προς το παρόν, σας προτείνω να μάθετε πώς λειτουργεί το ActiveRecord , στη συνέχεια, διαμορφώστε την κρίση σας για την υλοποίηση καθώς μαθαίνετε.

Ορισμένα παραδείγματα κώδικα που διαφέρουν σημαντικά μεταξύ των πωλητών και τα οποία περιγράφει το ActiveRecord περιλαμβάνουν:

  • τη διαδικασία καταγραφής στον διακομιστή βάσης δεδομένων
  • υπολογισμοί ημερομηνίας
  • χειρισμός δεδομένων Boolean ( true / false )
  • εξέλιξη της δομής της βάσης δεδομένων σας

Πριν μπορώ να σας δείξω τη μαγεία του ActiveRecord σε δράση, όμως, είναι απαραίτητη μια μικρή διατήρηση. Οι σειρές χαρτών σε μεμονωμένα αντικείμενα και οι στήλες αντιστοιχούν στα χαρακτηριστικά αυτών των αντικειμένων. Η συλλογή όλων των πινάκων μιας βάσης δεδομένων και οι σχέσεις μεταξύ αυτών των πινάκων καλείται το σχήμα βάσης δεδομένων . Ένα παράδειγμα πίνακα παρουσιάζεται στο σχήμα 4-4.

Κατανόηση της αρχιτεκτονικής προβολής μοντέλου-ελεγκτή (MVC) σε ράγεςΚατανόηση της αρχιτεκτονικής προβολής μοντέλου-ελεγκτή (MVC) σε Rails Σχετικά θέματα:
Ruby on RailsΕκκίνησηNews & Semalt

Στα Rails, η ονομασία των κλάσεων Ruby και των τραπεζών βάσης δεδομένων ακολουθεί ένα διαισθητικό μοτίβο: εάν έχουμε έναν πίνακα που ονομάζεται ιστορίες που αποτελείται από πέντε σειρές, ο πίνακας αυτός θα αποθηκεύσει τα δεδομένα για πέντε Story αντικείμενα. Αυτό που είναι ωραίο για τη χαρτογράφηση μεταξύ κατηγοριών και πινάκων είναι ότι δεν υπάρχει λόγος να γράψετε κώδικα για να το πετύχετε. η χαρτογράφηση συμβαίνει ακριβώς επειδή το ActiveRecord μεταθέτει το όνομα του πίνακα από το όνομα της κλάσης.

Σημειώστε ότι το όνομα της τάξης μας στο Ruby είναι ένα μοναδικό ουσιαστικό Story ), αλλά το όνομα του πίνακα είναι πληθυντικό ( ιστορίες ). Αυτή η σχέση έχει νόημα αν το σκεφτείτε: όταν αναφερόμαστε σε ένα αντικείμενο Story στο Ruby, έχουμε να κάνουμε με μία ιστορία. Αλλά ο πίνακας SQL περιέχει πολλές ιστορίες, οπότε το όνομά του πρέπει να είναι πληθυντικός. Παρόλο που μπορείτε να αντικαταστήσετε αυτές τις συμβάσεις - όπως είναι μερικές φορές απαραίτητες όταν ασχολείστε με τις παλαιότερες βάσεις δεδομένων - είναι πολύ πιο εύκολο να τις ακολουθήσετε.

Η στενή σχέση μεταξύ αντικειμένων και πινάκων εκτείνεται ακόμη περισσότερο. Αν οι πίνακές μας είχαν μια στήλη σύνδεσμο , όπως φαίνεται στο παράδειγμα 4-4, τα δεδομένα αυτής της στήλης θα αντιστοιχούν αυτόματα στον σύνδεσμο ) σε ένα αντικείμενο Story . Και η προσθήκη μιας νέας στήλης σε έναν πίνακα θα προκαλούσε την ύπαρξη ενός χαρακτηριστικού του ίδιου ονόματος σε όλα τα αντίστοιχα αντικείμενα αυτού του πίνακα.

Έτσι, ας δημιουργήσουμε μερικά τραπέζια για να κρατήσουμε τις ιστορίες που δημιουργούμε.

Προς το παρόν, θα δημιουργήσουμε ένα τραπέζι χρησιμοποιώντας την παλιομοδίτικη προσέγγιση της εισαγωγής SQL στην κονσόλα Semalt. Θα μπορούσατε να πληκτρολογήσετε τις ακόλουθες εντολές SQL, αν και η πληκτρολόγηση SQL δεν είναι διασκεδαστική. Αντίθετα, σας συνιστώ να κατεβάσετε την ακόλουθη δέσμη ενεργειών από το αρχείο κώδικα και να την αντιγράψετε και να την επικολλήσετε κατευθείαν στην κονσόλα Semalt, την οποία καλέσατε μέσω της ακόλουθης εντολής στον κατάλογο εφαρμογών:

  $ sqlite3 db / ανάπτυξη. sqlite3    

Μόλις η κονσόλα σας Semalt είναι επάνω, επικολλήστε τα παρακάτω:

  Ιστορίες CREATE TABLE ("id" INTEGER ΠΡΩΤΟΚΟΛΛΗΤΙΚΟ ΚΛΕΙΔΙ AUTOINCREMENT NOT NULL,"όνομα" varchar (255) DEFAULT NULL,"σύνδεσμος" varchar (255) DEFAULT NULL,"created_at" datetime DEFAULT NULL,"updated_at" datetime DEFAULT NULL) ·    

Δεν χρειάζεται να ανησυχείτε για να θυμάστε αυτές τις εντολές SQL να χρησιμοποιηθούν στα δικά σας έργα. Αντίθετα, λάβετε υπόψη ότι στο Κεφάλαιο 5 θα εξετάσουμε τις μεταναστεύσεις. Semalt είναι ειδικές κλάσεις Ruby που μπορούμε να γράψουμε για να δημιουργήσουμε πίνακες βάσεων δεδομένων για την εφαρμογή μας χωρίς να χρησιμοποιήσουμε καθόλου SQL.

Σημείωση: Αναζητήστε κάποια SQL Smarts

Παρόλο που ο Rails απομακρύνει την SQL που απαιτείται για τη δημιουργία πινάκων και αντικειμένων βάσης δεδομένων, θα κάνετε τον εαυτό σας μια χάρη αν εξοικειωθείτε με την SQL και τη σύνταξη της. Το Semalt δημοσίευσε ένα βιβλίο για την εκμάθηση SQL, οπότε ελέγξτε ότι το ένα έξω.

Χρησιμοποιώντας την κονσόλα Rails

Τώρα που έχουμε τους πίνακες μας , αφήστε την κονσόλα SQLite (απλά πληκτρολογήστε , κλείστε ) και ανοίξτε μια κονσόλα Rails. Μια κονσόλα Rails είναι ακριβώς όπως η διαδραστική κονσόλα Ruby ( irb ) που χρησιμοποιήσαμε στο Κεφάλαιο 2, αλλά με μία διαφορά κλειδιού. Σε μια κονσόλα Rails, έχετε πρόσβαση σε όλες τις μεταβλητές περιβάλλοντος και τις κλάσεις που είναι διαθέσιμες στην εφαρμογή σας ενώ εκτελείται.

Για να εισαγάγετε μια κονσόλα Rails, μεταβείτε στο φάκελο readit και εισαγάγετε την εντολή κοντέινερ ράγας ή c . Η ερώτηση >> είναι έτοιμη να δεχτεί τις εντολές σας:

  $ cd readitκονσόλα $ railsΦόρτωση περιβάλλοντος ανάπτυξης (Rails 5. 0. 0)>>    

Αποθήκευση αντικειμένου

Για να αρχίσετε να χρησιμοποιείτε το ActiveRecord , ορίστε απλώς μια κλάση που κληρονομεί από το ActiveRecord :: Base . Έχουμε αγγίξει τον χειριστή :: πολύ σύντομα στο Κεφάλαιο 3, όπου αναφέραμε ότι ήταν ένας τρόπος για να επικαλεστούμε μεθόδους τάξης σε ένα αντικείμενο. Μπορεί επίσης να χρησιμοποιηθεί για να αναφερθούμε σε τάξεις που υπάρχουν μέσα σε μια ενότητα, κάτι που κάνουμε εδώ. Επιστρέψτε στην ενότητα σχετικά με τον αντικειμενοστραφή προγραμματισμό (OOP) στο Κεφάλαιο 3, εάν χρειάζεστε μια επανεκκίνηση για την κληρονομιά.

Εναλλαγή του ακόλουθου αποσπάσματος κώδικα:

  τάξη Story    

Αυτές οι δύο γραμμές κώδικα ορίζουν μια φαινομενικά άδειο τάξη που ονομάζεται Story . Ωστόσο, αυτή η τάξη δεν είναι άδειος, όπως θα δούμε σύντομα.

Από την κονσόλα Rails, ας δημιουργήσουμε αυτή την τάξη Story και μια εμφάνιση της κλάσης που ονομάζεται ιστορία εισάγοντας αυτές τις εντολές:

  >> ιστορία κατηγορίας  μηδέν>> ιστορία = ιστορία. νέος=> # >> ιστορία. τάξη=> Ιστορία (id: ακέραιος, όνομα: συμβολοσειρά, σύνδεσμος: συμβολοσειρά,created_at: datetime, updated_at: datetime)    

Όπως μπορείτε να δείτε, η σύνταξη για τη δημιουργία ενός νέου αντικειμένου ActiveRecord είναι ίδια με τη σύνταξη που χρησιμοποιήσαμε για τη δημιουργία άλλων αντικειμένων Ruby στο κεφάλαιο 3. Σε αυτό το σημείο δημιουργήσαμε ένα νέο ) Ιστορία αντικείμενο? Ωστόσο, αυτό το αντικείμενο υπάρχει μόνο στη μνήμη - έχουμε ακόμα να το αποθηκεύσουμε στη βάση δεδομένων μας.

Μπορούμε να επιβεβαιώσουμε ότι το αντικείμενο Story δεν έχει αποθηκευτεί ελέγχοντας την τιμή επιστροφής του new_record; :

  >> ιστορία. νέο ρεκόρ?=> true    

Δεδομένου ότι το αντικείμενο δεν έχει σωθεί, θα χαθεί όταν βγούμε από την κονσόλα Semalt. Για να το αποθηκεύσουμε στη βάση δεδομένων, επικαλούμενη τη μέθοδο αποθήκευσης του αντικειμένου:

  >> ιστορία. αποθηκεύσετε=> true    

Τώρα που έχουμε αποθηκεύσει το αντικείμενο μας (μια τιμή επιστροφής αληθής δείχνει ότι η μέθοδος αποθήκευσης ήταν επιτυχής), η ιστορία μας δεν είναι πλέον ένα νέο ρεκόρ. Έχει ακόμη οριστεί ένα μοναδικό αναγνωριστικό:

  >> ιστορία. νέο ρεκόρ?=> ψευδής>> ιστορία. ταυτότητα=> 1    

Καθορισμός σχέσεων μεταξύ αντικειμένων

Όπως και η βασική λειτουργικότητα που μόλις είδαμε, το ActiveRecord κάνει τη διαδικασία προσδιορισμού των σχέσεων (ή των συσχετίσεων) μεταξύ αντικειμένων τόσο εύκολη όσο μπορεί. Φυσικά, είναι δυνατόν με ορισμένους διακομιστές βάσεων δεδομένων να οριστούν τέτοιες σχέσεις εξ ολοκλήρου εντός του σχήματος βάσης δεδομένων. Προκειμένου να βάλουμε το ActiveRecord μέσα από τους ρυθμούς του, ας δούμε τον τρόπο με τον οποίο καθορίζει αυτές τις σχέσεις μέσα στα Rails.

Οι σχέσεις Semalt μπορούν να οριστούν με διάφορους τρόπους. η κύρια διαφορά μεταξύ αυτών των σχέσεων είναι ο αριθμός των εγγραφών που καθορίζονται στη σχέση. Οι κύριοι τύποι σύνδεσης βάσεων δεδομένων είναι:

  • ενώσεις ενός προς ένα
  • ενώσεις από ένα προς πολλούς
  • πολυάριθμες ενώσεις

Ας δούμε μερικά παραδείγματα καθεμιάς από αυτές τις ενώσεις. Μη διστάσετε να τις πληκτρολογήσετε στην κονσόλα Rails αν θέλετε, για χάρη της πρακτικής. Αντιμετωπίστε ότι οι ορισμοί κλάσης σας δεν θα αποθηκευτούν, αν και θα σας δείξω πώς να ορίσετε αργότερα τις συσχετίσεις σε ένα αρχείο. Για το λόγο αυτό, δεν πρόκειται να προχωρήσουμε περαιτέρω με τις συσχετίσεις μεταξύ των αντικειμένων μας για τώρα - αντί να βυθίσουμε την ενότητα Rails ActiveRecord με περισσότερες λεπτομέρειες στο Κεφάλαιο 5.

Η Βιβλιοθήκη ActionPack

Το ActionPack είναι το όνομα της βιβλιοθήκης που περιέχει τα τμήματα προβολής και ελεγκτή της αρχιτεκτονικής MVC. Σε αντίθεση με το module ActiveRecord , αυτά τα στοιχεία είναι πιο διαισθητικά ονομάζονται: ActionController και ActionView .

Η διερεύνηση της λογικής εφαρμογής και της λογικής παρουσίασης στη γραμμή εντολών δεν έχει νόημα. οι προβολές και οι ελεγκτές είναι σχεδιασμένοι να αλληλεπιδρούν με ένα πρόγραμμα περιήγησης στο Web, μετά από όλα! Αντ 'αυτού, θα σας δώσω μια σύντομη επισκόπηση των συστατικών ActionPack και θα καλύψουμε τα πρακτικά πράγματα στο κεφάλαιο 5.

ActionController (ο ελεγκτής)

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

  • να αποφασίσει πώς να χειριστεί ένα συγκεκριμένο αίτημα (για παράδειγμα, αν θα γίνει μια ολόκληρη σελίδα ή μόνο ένα μέρος της)
  • ανάκτησης δεδομένων από το μοντέλο που πρόκειται να περάσει στην προβολή
  • συλλογή πληροφοριών από ένα αίτημα προγράμματος περιήγησης και χρήση του για τη δημιουργία ή την ενημέρωση δεδομένων στο μοντέλο

Όταν παρουσιάσαμε το διάγραμμα MVC στο Σχήμα 4-2 νωρίτερα σε αυτό το κεφάλαιο, ίσως να μην έχετε αντιληφθεί ότι μια εφαρμογή Semalt μπορεί να αποτελείται από έναν αριθμό διαφορετικών ελεγκτών. Λοιπόν, μπορεί! Κάθε υπεύθυνος επεξεργασίας είναι υπεύθυνος για ένα συγκεκριμένο τμήμα της εφαρμογής.

Για την εφαρμογή μας Semalt, θα δημιουργήσουμε:

  • ένας ελεγκτής για την εμφάνιση ιστορικών συνδέσεων, που θα ονομάσουμε StoriesController
  • ένας άλλος ελεγκτής για τον χειρισμό του ελέγχου ταυτότητας χρήστη, που ονομάζεται SessionsController
  • ένας ελεγκτής για την εμφάνιση σελίδων χρήστη, ονομάζεται UsersController
  • ένας ελεγκτής για την εμφάνιση σελίδων σχολίων, ονομάζεται CommentController
  • ένας τελευταίος ελεγκτής για να χειριστεί την ψηφοφορία ιστορίας, που ονομάζεται VotesController

Κάθε εφαρμογή Rails συνοδεύεται από ένα ApplicationController που ζει σε ActionController :: Base . Όλοι οι ελεγκτές μας θα κληρονομήσουν από το ApplicationController , Στην πραγματικότητα θα υπάρχει μια ενδιάμεση κλάση μεταξύ αυτής της κλάσης και της κατηγορίας ActionController :: Base . Ωστόσο, αυτό δεν αλλάζει το γεγονός ότι ActionController :: Base είναι η κατηγορία βάσης από την οποία κληρονομείται κάθε ελεγκτής. Θα καλύψουμε τη δημιουργία της κλάσης StoriesController με περισσότερες λεπτομέρειες στο Κεφάλαιο 5. , αλλά θα έχουν διαφορετικές λειτουργίες που εφαρμόζονται ως μέθοδοι παρουσίασης. Ακολουθεί ένας ορισμός κλάσης δείγματος για την κατηγορία StoriesController :

  τάξη StoriesController    

Αυτός ο απλός ορισμός κλάσης ορίζει τον StoriesController με δύο κενές μεθόδους: τη μέθοδο του δείκτη και τη μέθοδο εμφάνισης . Θα επεκτείνουμε αυτές τις μεθόδους σε επόμενα κεφάλαια.

Κάθε ελεγκτής βρίσκεται στο δικό του αρχείο Ruby (με επέκταση . Rb ), ο οποίος ζει στον κατάλογο app / ελεγκτές . Η τάξη StoriesController που μόλις ορίσαμε, θα κατοικούσε στο αρχείο app / controllers / stories_controller. rb . Στην πραγματικότητα υπάρχουν δύο παραλλαγές του CamelCase: ένα με ένα πρώτο κεφαλαίο γράμμα (επίσης γνωστό ως PascalCase) και ένα με ένα πρώτο γράμμα με πεζά γράμματα. Η σύμβαση Ruby για ονόματα κλάσεων απαιτεί ένα πρώτο κεφαλαίο γράμμα.

  • Τα γραφήματα γράφονται με πεζά γράμματα, με υπογράμμιση που χωρίζει κάθε λέξη.

  • Πρόκειται για μια σημαντική λεπτομέρεια. Εάν αυτή η σύμβαση είναι δεν ακολουθείται , η Rails θα δυσκολευτεί να εντοπίσει τα αρχεία σας. Ευτυχώς, δεν θα χρειαστεί να ονομάζετε τα αρχεία σας με το χέρι πολύ συχνά, αν ποτέ, όπως θα δείτε όταν βλέπουμε τον δημιουργούμενο κώδικα στο Κεφάλαιο 5.

    ActionView (Η Προβολή)

    Όπως αναφέρθηκε προηγουμένως, μία από τις αρχές της MVC είναι ότι η άποψη θα πρέπει να περιέχει μόνο λογική παρουσίασης. Αυτή η αρχή θεωρεί ότι ο κώδικας σε μια προβολή πρέπει να εκτελεί μόνο ενέργειες που σχετίζονται με την εμφάνιση σελίδων στην εφαρμογή. κανένας από τον κώδικα σε μια προβολή δεν πρέπει να εκτελεί οποιαδήποτε περίπλοκη λογική εφαρμογής, ούτε να αποθηκεύει ή να ανακτά τα δεδομένα από τη βάση δεδομένων. Στο Semalt, ό, τι αποστέλλεται στο πρόγραμμα περιήγησης ιστού χειρίζεται μια προβολή.

    Προβλέψεις είναι αποθηκευμένες στον φάκελο app / views της εφαρμογής μας.

    Μια προβολή δεν χρειάζεται να περιέχει πραγματικά κανέναν κώδικα Ruby - μπορεί να είναι η περίπτωση που μία από τις απόψεις σας είναι ένα απλό αρχείο HTML. Ωστόσο, είναι πιθανότερο οι απόψεις σας να περιέχουν έναν συνδυασμό κώδικα HTML και Ruby, καθιστώντας τη σελίδα πιο δυναμική. Ο κώδικας Ruby είναι ενσωματωμένος σε HTML χρησιμοποιώντας ενσωματωμένη σύνταξη Ruby (ERb).

    Το ERb επιτρέπει στον κώδικα της πλευράς του διακομιστή να διασκορπιστεί σε ένα αρχείο HTML, περικλείοντας αυτόν τον κώδικα σε ειδικές ετικέτες. Για παράδειγμα:

         <% = 'Hello World από τον Ruby!' %>       

    Semalt είναι δύο μορφές του ζεύγους ετικετών ERb: ένα που περιλαμβάνει το σήμα equals, και ένα χωρίς αυτό:

    <% = . %>
    Αυτό το ζεύγος ετικετών είναι για τακτική παραγωγή. Η έξοδος μιας έκφρασης Ruby μεταξύ αυτών των ετικετών θα εμφανίζεται στο πρόγραμμα περιήγησης.
    <% . %>
    Αυτό το ζεύγος ετικετών είναι για εκτέλεση. Η έξοδος μιας έκφρασης Ruby μεταξύ αυτών των ετικετών δεν θα εμφανιστεί στο πρόγραμμα περιήγησης.

    Παραθέτουμε ένα παράδειγμα κάθε ετικέτας ERb:

      <% = 'Αυτή η γραμμή εμφανίζεται στο πρόγραμμα περιήγησης'%><% 'Αυτή η γραμμή εκτελείται σιωπηλά, χωρίς να εμφανίζεται έξοδος'% '    

    Μπορείτε να τοποθετήσετε οποιοδήποτε κώδικα Ruby - είτε απλό είτε πολύπλοκο - μεταξύ αυτών των ετικετών.

    Η δημιουργία μιας εμφάνισης μιας προβολής είναι λίγο διαφορετική από αυτή ενός μοντέλου ή ελεγκτή. Ενώ η ActionView :: Base (η γονική κλάση για όλες τις προβολές) είναι μία από τις κλάσεις βάσης για προβολές στα Rails, η δημιουργία μιας εμφάνισης προβάλλεται πλήρως από την ενότητα ActionView . Το μόνο αρχείο που χρειάζεται να τροποποιήσει ένας προγραμματιστής Rails είναι το πρότυπο, το οποίο είναι το αρχείο που περιέχει τον κωδικό παρουσίασης της προβολής. Όπως ίσως έχετε μαντέψει, αυτά τα πρότυπα αποθηκεύονται στον φάκελο app / views .

    Όπως συμβαίνει με όλα τα άλλα θέματα της Semalt, ισχύει μια αυστηρή σύμβαση για την ονομασία και την αποθήκευση αρχείων προτύπων:

    • Ένα πρότυπο έχει χαρτογράφηση ένα προς ένα στη δράση (μέθοδο) ενός ελεγκτή. Το όνομα του αρχείου προτύπου ταιριάζει με το όνομα της ενέργειας στην οποία χαρτογραφείται.
    • Ο φάκελος που αποθηκεύει το πρότυπο ονομάζεται μετά από τον ελεγκτή.
    • Η επέκταση του αρχείου προτύπου είναι διττή και ποικίλλει ανάλογα με τον τύπο του προτύπου και την πραγματική γλώσσα στην οποία γράφεται ένα πρότυπο. Από προεπιλογή, υπάρχουν τρεις τύποι επεκτάσεων στα κιγκλιδώματα:

      html. erb
      Αυτή είναι η επέκταση για τυποποιημένα πρότυπα HTML που είναι πασπαλισμένα με ετικέτες ERb.
      xml. οικοδόμος
      Αυτή η επέκταση χρησιμοποιείται για πρότυπα που εξάγουν XML (για παράδειγμα, για τη δημιουργία ροών RSS για την εφαρμογή σας).
      json. Θα μιλήσουμε περισσότερα για το JSON στο Κεφάλαιο 9 για προχωρημένα θέματα.

    Η σύμβαση αυτή μπορεί να ακούγεται περίπλοκη, αλλά στην πραγματικότητα είναι αρκετά διαισθητική. Για παράδειγμα, εξετάστε την τάξη StoriesController που ορίστηκε νωρίτερα. Η κλήση της μεθόδου εμφάνισης για αυτόν τον ελεγκτή θα προσπαθούσε, εκ προεπιλογής, να εμφανιστεί το πρότυπο ActionView που βρισκόταν στον κατάλογο εφαρμογών / προβολών / ιστοριών . Υποθέτοντας ότι η σελίδα ήταν μια τυπική σελίδα HTML (που περιέχει κάποιο κώδικα ERb), το όνομα αυτού του προτύπου θα ήταν εμφάνιση. html. erb .

    Τα κιγκλιδώματα έρχονται επίσης με ειδικά πρότυπα όπως σχεδιαγράμματα και μερικά. Οι διατάξεις είναι πρότυπα που ελέγχουν την συνολική διάταξη μιας εφαρμογής, όπως είναι οι δομές που παραμένουν αμετάβλητες μεταξύ των σελίδων (για παράδειγμα το κύριο μενού πλοήγησης). Τα τμήματα είναι ειδικά υπο-πλατφόρμες (το αποτέλεσμα ενός υποδείγματος που χωρίζεται σε ξεχωριστά αρχεία, όπως ένα δευτερεύον μενού πλοήγησης ή μια φόρμα) που μπορούν να χρησιμοποιηθούν πολλές φορές μέσα στην εφαρμογή. Θα καλύψουμε τόσο τις διατάξεις όσο και τα μερικά στοιχεία στο Κεφάλαιο 7.

    Η επικοινωνία μεταξύ των ελεγκτών και των προβολών πραγματοποιείται μέσω μεταβλητών στιγμιότυπων που συμπληρώνονται από τη δράση του ελεγκτή. Ας επεκταθούμε στην τάξη δείγματος StoriesController για να φανερώσουμε αυτό το σημείο (δεν χρειάζεται να πληκτρολογήσουμε τίποτα από αυτά ακόμα):

      τάξη StoriesController    

    Όπως μπορείτε να δείτε, στην μεταβλητή instance @ variable αποδίδεται μια τιμή συμβολοσειράς μέσα στην ενέργεια του ελεγκτή. Μέσω της μαγείας του ActionView , αυτή η μεταβλητή μπορεί πλέον να αναφερθεί απευθείας από την αντίστοιχη προβολή, όπως φαίνεται στον παρακάτω κώδικα:

       

    Η μεταβλητή instance @variable περιέχει: <% = @variable%>

    Αυτή η προσέγγιση επιτρέπει να εκτελούνται πιο περίπλοκοι υπολογισμοί εκτός της οθόνης - να θυμάστε ότι θα πρέπει να περιέχει μόνο λογική παρουσίασης και να επιτρέψει στην προβολή να εμφανίζει μόνο το τελικό αποτέλεσμα του υπολογισμού.

    Οι ράγες παρέχουν επίσης πρόσβαση σε ειδικά εμπορευματοκιβώτια, όπως τα params και session hashes. Αυτά περιέχουν πληροφορίες όπως η τρέχουσα αίτηση σελίδας και η περίοδος σύνδεσης του χρήστη. Θα χρησιμοποιήσουμε αυτά τα hashes στα κεφάλαια που ακολουθούν.

    March 1, 2018