Ruby on Rails - Controller
Il controller Rails è il centro logico della tua applicazione. Coordina l'interazione tra l'utente, le viste e il modello. Il responsabile del trattamento è anche sede di una serie di importanti servizi ausiliari.
È responsabile dell'instradamento delle richieste esterne alle azioni interne. Gestisce estremamente bene gli URL a misura di utente.
Gestisce il caching, che può dare alle applicazioni miglioramenti delle prestazioni di ordini di grandezza.
Gestisce i moduli di supporto, che estendono le capacità dei modelli di visualizzazione senza aumentare il loro codice.
Gestisce le sessioni, dando agli utenti l'impressione di una continua interazione con le nostre applicazioni.
Il processo per creare un controller è molto semplice ed è simile al processo che abbiamo già utilizzato per creare un modello. Creeremo solo un controller qui -
library\> rails generate controller Book
Nota che stai usando le maiuscole Book e stai usando la forma singolare. Questo è un paradigma di Rails che dovresti seguire ogni volta che crei un controller.
Questo comando esegue diverse attività, di cui le seguenti sono rilevanti qui:
Crea un file chiamato app/controllers/book_controller.rb
Se guardi book_controller.rb, lo troverai come segue:
class BookController < ApplicationController
end
Le classi controller ereditano da ApplicationController, che è l'altro file nella cartella controller:application.rb.
L' ApplicationController contiene codice che può essere eseguito in tutti i controller e eredita dalla classe Rails ActionController :: Base .
Non devi ancora preoccuparti di ApplicationController , quindi definiamo solo alcuni stub di metodo inbook_controller.rb. In base alle proprie esigenze, è possibile definire un numero qualsiasi di funzioni in questo file.
Modifica il file in modo che abbia l'aspetto seguente e salva le modifiche. Nota che dipende da te quale nome vuoi dare a questi metodi, ma è meglio dare nomi pertinenti.
class BookController < ApplicationController
def list
end
def show
end
def new
end
def create
end
def edit
end
def update
end
def delete
end
end
Ora implementiamo tutti i metodi uno per uno.
Implementazione del metodo elenco
Il metodo elenco fornisce un elenco di tutti i libri nel database. Questa funzionalità verrà ottenuta dalle seguenti righe di codice. Modifica le seguenti righe nel file book_controller.rb.
def list
@books = Book.all
end
La riga @books = Book.all nel metodo list dice a Rails di cercare nella tabella books e di memorizzare ogni riga che trova nell'oggetto istanza @books.
Implementazione del metodo show
Il metodo mostra mostra solo ulteriori dettagli su un singolo libro. Questa funzionalità verrà ottenuta dalle seguenti righe di codice.
def show
@book = Book.find(params[:id])
end
La riga @book = Book.find (params [: id]) del metodo show dice a Rails di trovare solo il libro che ha l'id definito in params [: id].
L'oggetto params è un contenitore che consente di passare valori tra le chiamate di metodo. Ad esempio, quando sei sulla pagina chiamata dal metodo list, puoi fare clic su un collegamento per un libro specifico e passa l'ID di quel libro tramite l'oggetto params in modo che show possa trovare il libro specifico.
Implementazione del nuovo metodo
Il nuovo metodo fa sapere a Rails che creerai un nuovo oggetto. Quindi aggiungi il seguente codice in questo metodo.
def new
@book = Book.new
@subjects = Subject.all
end
Il metodo sopra verrà chiamato quando mostrerai una pagina all'utente per ricevere l'input dell'utente. Qui la seconda riga prende tutti i soggetti dal database e li inserisce in un array chiamato @subjects.
Implementazione del metodo create
Dopo aver ricevuto l'input dell'utente utilizzando il modulo HTML, è il momento di creare un record nel database. Per ottenere ciò, modifica il metodo create nel book_controller.rb in modo che corrisponda a quanto segue:
def create
@book = Book.new(book_params)
if @book.save
redirect_to :action => 'list'
else
@subjects = Subject.all
render :action => 'new'
end
end
def book_params
params.require(:books).permit(:title, :price, :subject_id, :description)
end
La prima riga crea una nuova variabile di istanza chiamata @book che contiene un oggetto Book costruito dai dati, l'utente inviato. Ilbook_params viene utilizzato per raccogliere tutti i campi dall'oggetto :books. I dati sono stati passati dal nuovo metodo per creare utilizzando l'oggetto params.
La riga successiva è un'istruzione condizionale che reindirizza l'utente al file listmetodo se l'oggetto viene salvato correttamente nel database. Se non viene salvato, l'utente viene rimandato al nuovo metodo. Il metodo redirect_to è simile all'esecuzione di un meta refresh su una pagina web: ti inoltra automaticamente alla tua destinazione senza alcuna interazione da parte dell'utente.
Quindi @subjects = Subject.all è richiesto nel caso in cui non salvi i dati correttamente e diventi simile a quello della nuova opzione.
Implementazione del metodo di modifica
Il metodo di modifica sembra quasi identico al metodo show. Entrambi i metodi vengono utilizzati per recuperare un singolo oggetto in base al suo ID e visualizzarlo su una pagina. L'unica differenza è che il metodo di visualizzazione non è modificabile.
def edit
@book = Book.find(params[:id])
@subjects = Subject.all
end
Questo metodo verrà chiamato per visualizzare i dati sullo schermo che verranno modificati dall'utente. La seconda riga cattura tutti i soggetti dal database e li inserisce in un array chiamato @subjects.
Implementazione del metodo di aggiornamento
Questo metodo verrà chiamato dopo il metodo di modifica, quando l'utente modifica un dato e desidera aggiornare le modifiche nel database. Il metodo di aggiornamento è simile al metodo di creazione e verrà utilizzato per aggiornare i libri esistenti nel database.
def update
@book = Book.find(params[:id])
if @book.update_attributes(book_param)
redirect_to :action => 'show', :id => @book
else
@subjects = Subject.all
render :action => 'edit'
end
end
def book_param
params.require(:book).permit(:title, :price, :subject_id, :description)
end
Il metodo update_attributes è simile al metodo save utilizzato da create ma invece di creare una nuova riga nel database, sovrascrive gli attributi della riga esistente.
Quindi @subjects = Subject.all è richiesta la riga nel caso in cui non salvi i dati correttamente, quindi diventa simile all'opzione di modifica.
Implementazione del metodo di eliminazione
Se desideri eliminare un record dal database, utilizzerai questo metodo. Implementa questo metodo come segue.
def delete
Book.find(params[:id]).destroy
redirect_to :action => 'list'
end
La prima riga trova il classificato in base al parametro passato tramite l'oggetto params e quindi lo elimina utilizzando il metodo destroy. La seconda riga reindirizza l'utente al metodo list utilizzando una chiamata redirect_to.
Metodi aggiuntivi per visualizzare i soggetti
Supponi di voler offrire ai tuoi utenti la possibilità di sfogliare tutti i libri in base a un determinato argomento. Quindi, puoi creare un metodo all'interno di book_controller.rb per visualizzare tutti gli argomenti. Supponiamo che il nome del metodo siashow_subjects -
def show_subjects
@subject = Subject.find(params[:id])
end
Finalmente il tuo book_controller.rb il file avrà il seguente aspetto:
class BooksController < ApplicationController
def list
@books = Book.all
end
def show
@book = Book.find(params[:id])
end
def new
@book = Book.new
@subjects = Subject.all
end
def book_params
params.require(:books).permit(:title, :price, :subject_id, :description)
end
def create
@book = Book.new(book_params)
if @book.save
redirect_to :action => 'list'
else
@subjects = Subject.all
render :action => 'new'
end
end
def edit
@book = Book.find(params[:id])
@subjects = Subject.all
end
def book_param
params.require(:book).permit(:title, :price, :subject_id, :description)
end
def update
@book = Book.find(params[:id])
if @book.update_attributes(book_param)
redirect_to :action => 'show', :id => @book
else
@subjects = Subject.all
render :action => 'edit'
end
end
def delete
Book.find(params[:id]).destroy
redirect_to :action => 'list'
end
def show_subjects
@subject = Subject.find(params[:id])
end
end
Ora salva il file del controller.
Cosa c'è dopo?
Hai creato quasi tutti i metodi, che funzioneranno sul backend. Successivamente definiremo percorsi (URL) per le azioni.