Ruby on Rails from Scratch Settimana 3

Benvenuti in Ruby on Rails From Scratch Week 3! Questa settimana, ci concentreremo su cose specifiche che è necessario conoscere sul framework. Ad esempio, parleremo della manipolazione della struttura del progetto in due modi (rendering e reindirizzamento). Parliamo anche di come aggiungi link nelle guide e come commentare il codice. Iniziamo già!

Riscuotere

Se non hai letto le parti 1 e 2, si consiglia vivamente di esaminarle prima di continuare con questo tutorial.

  • Prima settimana
  • Settimana due

Aggiunta di interazioni tra le azioni

Ora che abbiamo imparato come impostare le variabili di istanza per trasferire le informazioni dal controller alla vista, è il momento di imparare come trasmettere i dati tra diverse azioni in un controller. Per questo tutorial, continueremo a utilizzare il controller di apprendimento. Non abbiamo davvero bisogno di mantenere ciò che abbiamo fatto la settimana scorsa, ma puoi farlo se ritieni che sia una buona risorsa. Iniziamo semplicemente:

Esegui un'altra azione in un'altra azione

Per questo esempio, l'intestazione è più complessa della lezione reale. Useremo semplicemente cosa c'è in un'azione e facciamo lo stesso in un altro. Usiamo le conoscenze acquisite la scorsa settimana sulle variabili di istanza e le applichiamo ora. Per prima cosa, creiamo una nuova azione chiamata "another_action"; poi un'altra azione chiamata "testo". Stiamo per ottenere l'azione dal testo e inserirla in "another_action". Lo dimostreremo, facendo riferimento a una variabile di istanza nella vista di "un'altra_azione" che è stata assegnata nel controller "testo". Scusa, se questo non aveva senso. Se non hai ottenuto ciò che ho appena detto, guarda il seguente codice, che si spera ti possa aiutare:

 class LearnController < ApplicationController def another_action text end def text @text = 'This text came from another action' end end

Creeremo quindi una vista chiamata "another_action.html.erb", in cui facciamo riferimento al testo variabile.

  Azione Demo   <%= @text %>  

Spiegazione

Come puoi vedere, abbiamo fatto riferimento all'azione "testo" semplicemente inserendola all'interno di "un'altra_azione". Facendo ciò, abbiamo anche passato la definizione di "testo", che era la variabile di istanza. Per dimostrare ulteriormente questo principio, mettiamolo in diverse situazioni, tutte funzioni.

Situazione 1- Impostazione di una variabile di istanza uguale a un'azione

 class LearnController < ApplicationController def another_action @text = text end def text misc_text = 'This text really traveled!' end end

Situazione 1 Risultato

Situazione 2 - Sostituisci variabile

Ora diventeremo ancora più complessi:

 class LearnController < ApplicationController def another_action @text = "text you'll never see" @text = text end def text wanted_text = overwrite_view end def overwrite_view overwrite_text = 'This text overwrote the original text' end end

Situazione 2 Risultato

Questo è l'ordine degli eventi che ha fatto il seguente codice:

  • Ha dato alla variabile di istanza "testo" un valore di "testo che non vedrai mai"
  • Quindi lo ha nuovamente assegnato all'azione "testo"
  • La variabile "testo", ora ha il valore del testo desiderato della variabile locale.
  • La variabile wanted_text ha un valore dell'azione "overwrite_view"
  • Overwrite_view ha una variabile locale con un valore di "Questo testo ha sovrascritto il testo originale"
  • Questo riporta alla variabile di istanza di @text.

Situazione 3: trasportare una variabile

Manterremo questo più semplice:

class LearnController < ApplicationController def another_action @text = "text you'll never see" text end def text @text = 'This text overwrote the original text' end end


Situazione 3 Risultato

Situazione 4 Restituzione di qualcosa di specifico

class LearnController < ApplicationController def another_action @text = text end def text first = 'This text should not be passed to @text' second = 'This text would be put into the variable on default' return first end end

Questo esempio è particolarmente importante, poiché ora stai imparando un po 'più di sintassi; il ritorno comando. Questo dirà all'azione cosa restituire alla fine.

Situazione 4 Risultato

Rails Links

Tutti dovrebbero già sapere come creare un normale collegamento HTML. (Utilizzando Testo) Ma c'è anche un modo per farlo con Rails. Questo metodo non è Ruby, ma piuttosto parte del framework. Detto questo, puoi usarlo solo in file HTML ruby ​​incorporati, non in file rb puri. Quindi come lo facciamo? Ecco il codice:

  Rails Link Demo   <%= link_to('Another Action Link', :controller => 'learn',: action => 'another_action')%>  

A prima vista, potresti chiederti perché cambieresti il ​​modo in cui scrivi i link, specialmente se la sostituzione è più lunga! Beh, una delle ragioni principali è la leggibilità. Puoi facilmente leggerlo e sapere esattamente a cosa collegherà. Per quanto riguarda la lunghezza, la parte: controller => non è necessaria se si sta eseguendo il collegamento a un'azione all'interno dello stesso controller.

Con questo pezzo di codice di rotaie stiamo anche vedendo simboli. ": Controller =>" è un simbolo. Parleremo di più su ciò che faranno dopo, ma per ora riconosciamo solo i due punti.

Rendering in Rails

All'inizio di questa serie, abbiamo parlato un po 'dei valori predefiniti sensibili delle rotaie. Uno dei valori di default è generare una vista che abbia lo stesso nome dell'azione nella vista corrispondente. Ma cosa succederebbe se volessimo sovrascrivere quello che i binari fanno automaticamente? Questo è in realtà abbastanza semplice e una tecnica molto utile. Quando lavori a un progetto del mondo reale, puoi immaginare quanto sarebbe "goffo" il controller se fosse necessario creare una vista e un'azione separate nel controller per ciascuna pagina. Rails ha comunque una soluzione, che si chiama rendering. Rendering ti permette di specificare quale vista usare per ogni azione. Tenete a mente però che, come i link dei binari, questo è anche un codice esclusivo per i binari e non rubino, e inteso solo per il controller.

Se quanto sopra ti ha lasciato un po 'confuso, lascia che ti mostri come farlo. Questo si spera che lo chiarisca un po '. Per questo primo esempio, renderemo l'azione alla vista che normalmente sarebbe comunque visualizzata. In altri termini, questo codice di rendering non fa nulla che non accadrebbe senza di esso. Tutto ciò che sta facendo è mostrare un codice che di solito è solo "assunto".

 def index render: action => 'index' end

Rendering di un'azione in un'altra vista

L'ultimo esempio non è molto utile in quanto il risultato viene comunque raggiunto automaticamente. Ma cosa succederebbe se avessi una vista davvero avanzata per un'altra azione e volessi la stessa vista per un'azione diversa. Non sarebbe solo noioso creare un'altra vista identica per ogni azione che crei, ma sarebbe anche quasi impossibile aggiornarla! Tutto ciò può essere risolto rendendo ogni azione simile a un'azione specifica. Esamina il seguente pezzo di codice che spiegherò in seguito e noterai le diverse parti.

text_controller.rb:

 class LearnController < ApplicationController def index render :action => 'text' end def text @text = 'Testo'end def other @text ='Altro'render: action =>' text 'end end

text.html.erb:

   Demo di rendering rotaie 

Benvenuto a <%= @text %> Pagina

Spiegazione del codice:

Azione indice

Avrai notato che ho incluso un'azione chiamata "indice". Questa azione verrà visualizzata se si va su una directory per "imparare". Funzionerà come farebbe un normale file di indice. Non è necessario creare un'azione specifica per l'indice. È possibile utilizzare l'argomento precedentemente trattato di ereditare anche un'altra azione.

Rendering alla stessa vista

Per questo esempio, avevamo solo bisogno di una vista per tutte le azioni; e tutti hanno prodotto pagine diverse. Per me, questo è abbastanza incredibile per la quantità di lavoro che abbiamo messo.

Nota: questo potrebbe sembrare ovvio per alcuni, ma fai attenzione al doppio rendering. Il doppio rendering causerà un errore perché stai provando a eseguire un'azione in due posti diversi. Puoi essere in due posti contemporaneamente? No, e nemmeno un'azione. Se vuoi vedere come appare, basta eseguire un'azione su due diverse viste. Il motivo per cui accade mentre stai facendo progetti più complessi è perché la scia delle azioni può diventare piuttosto complessa e potresti creare questo errore accidentalmente.

Assicurati di avere il concetto base di rendering, in quanto sarà una tecnica molto importante che utilizzerai spesso come sviluppatore di rotaie.

Reindirizzare un'azione

Il reindirizzamento di un'azione è simile al rendering di un'azione nel fatto che anch'essa è un codice di rotaia e viene utilizzata solo nel controller. Inoltre, influenza il flusso dell'applicazione. Come puoi intuire dal nome, il reindirizzamento ti consente di ... reindirizzare bene.

Potresti essere sorpreso da quante volte usi il comando di reindirizzamento. Ecco alcuni usi comuni:

  • Creazione di pagine alias
  • Esecuzione di un'azione nel controller e quindi reindirizzamento a una pagina secondaria
  • Se c'è un errore, reindirizza a una pagina di errore
  • Se l'utente non ha effettuato l'accesso, inviarli a una pagina di accesso

Basta chiacchiere, passiamo al codice! Per questo esempio di codice, modificheremo solo il controller dell'ultimo esempio e lasceremo la visualizzazione uguale. Come vedrai, il reindirizzamento è molto simile nel formato al rendering:

 class LearnController < ApplicationController def index redirect_to :action => 'text' end def text @text = 'Testo'redirect_to: action =>' other 'end def altro render: action =>' text 'end end

Ora vai all'azione indice nel tuo browser. Noterai che finisci con l'altra azione nella barra degli indirizzi. Esaminiamo questo codice:

  • Per prima cosa, reindirizziamo al testo dell'azione. Come il collegamento in rotaie, puoi anche specificare un controller se stai reindirizzando verso un altro controller. Dovresti semplicemente mettere: controller => 'learn', prima dell'azione.
  • Il browser ora passa all'azione del testo. Qui imposta un valore per @text. Ma il browser non ha valore per @text. Questo perché il reindirizzamento essenzialmente dimentica qualsiasi cosa tu dica in quell'azione.
  • Ora siamo reindirizzati ad altri. Qui mostriamo alla vista del testo.

Renderizza o reindirizza?

Mentre ci sono alcuni scenari ovvi in ​​cui si scegliere di eseguire il rendering o il reindirizzamento; ci possono essere delle decisioni più difficili. Tuttavia, una chiave importante è che se si inviano dati in un database o qualcosa che sta cambiando l'applicazione, utilizzare un reindirizzamento. In caso contrario, un aggiornamento potrebbe inviare nuovamente i dati.

Pensieri finali

Spero che ragazzi abbiate imparato molto dal tutorial di questa settimana! Abbiamo coperto molti concetti importanti, quindi se sei ancora confuso da qualcosa, rileggilo. La prossima settimana probabilmente entreremo nella sintassi ruby!

Come sempre, sentitevi liberi di lasciare domande nei commenti. Inoltre, ti preghiamo di scrivere questo articolo se ti ha aiutato!