Ruby on Rails från Scratch Week 3

Välkommen till Ruby on Rails From Scratch Week 3! I veckan fokuserar vi på specifika saker som du behöver veta om ramen. Vi kommer till exempel att prata om att manipulera projektets struktur på två sätt (återgivning och omdirigering). Vi pratar också om hur du lägger till länkar i rader och hur man kommenterar kod. Låt oss börja redan!

Komma ikapp

Om du inte har läst del 1 och 2 rekommenderar vi starkt att du granskar dem innan du fortsätter med den här handledningen.

  • Vecka ett
  • Vecka två

Lägga till interaktioner bland åtgärder

Nu när vi har lärt oss hur man ställer in instansvariabler för att överföra information från regulatorn till vyn, är det dags att lära sig att överföra data mellan olika åtgärder i en kontroller. För den här handledningen fortsätter vi att använda Learning Controller. Vi behöver verkligen inte behålla vad vi gjorde förra veckan, men du kan om du tycker att det är en bra resurs. Vi börjar enkelt:

Utför en annan åtgärd i en annan åtgärd

För detta exempel är rubriken mer komplex än den verkliga lektionen. Vi ska helt enkelt använda vad som finns i en åtgärd och göra detsamma i en annan. Låt oss använda den kunskap vi fick i förra veckan om instansvariabler, och tillämpa den nu. Låt oss först skapa en ny åtgärd som heter "another_action"; sedan en annan åtgärd som heter "text". Vi ska sedan få åtgärden från text och sätta den i "another_action". Vi kommer att bevisa detta genom att hänvisa till en instansvariabel i den syn på "another_action" som tilldelades i "text" -kontrollen. Tyvärr, om det inte var vettigt. Om du inte fick det jag just sa, kolla på följande kod, som förhoppningsvis hjälper dig:

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

Vi ska sedan skapa en vy som heter "another_action.html.erb", där vi hänvisar till den variabla texten.

  Action Demo   <%= @text %>  

Förklaring

Som du kan se hänvisade vi åtgärden "text" helt enkelt genom att placera det inuti "another_action". Genom att göra detta passerade vi också definitionen av "text", vilket var instansvariabeln. För att ytterligare visa denna princip, låt oss sätta detta i flera olika situationer, som alla fungerar.

Situation 1- Ställ in en instansvariabel som är lika med en åtgärd

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

Situation 1 Resultat

Situation 2 - Ersätt variabel

Nu ska vi bli ännu mer komplexa:

 klass 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

Situation 2 Resultat

Det här är händelsernas ordning som följande kod gjorde:

  • Gav instansvariabeln "text" ett värde av "text som du aldrig kommer att se"
  • Sedan tilldelades det till åtgärden "text"
  • Variabeln "text" har nu värdet av den önskade texten i den lokala variabeln.
  • Variabelen wanted_text har ett värde av åtgärden "overwrite_view"
  • Overwrite_view har en lokal variabel med ett värde på "Denna text överstiger originaltexten"
  • Detta går tillbaka till instansvariabeln för @text.

Situation 3 Bär en variabel

Vi kommer att behålla den här enklare:

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


Situation 3 Resultat

Situation 4 Återkommer något specifikt

klass 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

Detta exempel är särskilt viktigt, eftersom du nu lär dig lite mer syntax; de lämna tillbaka kommando. Detta kommer att berätta åtgärden vad som ska återvända i slutet.

Situation 4 Resultat

Rails Links

Alla borde redan veta hur man skapar en vanlig HTML-länk. (Använder sig av Text) Men det finns också ett sätt att göra det med Rails. Denna metod är inte Ruby, utan snarare en del av ramen. Med det sagt kan du bara använda den i inbyggda ruby ​​HTML-filer, inte rena rb-filer. Så hur gör vi det? Här är koden:

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

Vid första anblicken kanske du undrar varför du någonsin skulle ändra hur du skriver länkar, speciellt om ersättningen är längre! Jo en huvudorsak är läsbarhet. Du kan enkelt läsa detta och vet exakt vad det ska länka till. När det gäller längd, är delen: controller => inte nödvändig om du länkar till en åtgärd inom samma kontroller.

Med denna del av rails kod ser vi också symboler. ": Controller =>" är en symbol. Vi pratar mer om vad de gör senare, men för att just nu bara känna igen kolon.

Rendering i Rails

Tidigare i denna serie pratade vi lite om skenans förnuftiga standardvärden. Ett av standardinställningarna är att generera en vy som har samma namn som åtgärden i motsvarande vy. Men vad händer om vi ville skriva över vilka rails som automatiskt gör? Det här är faktiskt ganska enkelt, och en väldigt användbar teknik. När du arbetar med ett verkligt världsprojekt kan du föreställa dig hur "klumpig" din kontroller skulle få om du behövde skapa en separat vy och åtgärd i kontrollenheten för varje sida. Rails har dock en lösning som kallas rendering. Tolkning kan du ange vilken vy som ska användas för varje åtgärd. Tänk på att det, som skenor, är det också skenor exklusiv kod och inte rubin, och menade endast för regulatorn.

Om ovanstående har lämnat dig lite förvirrad, låt mig visa dig hur man gör det. Detta kommer förhoppningsvis att klargöra det lite. För det här första exemplet kommer vi att göra åtgärden till den uppfattning som det normalt skulle göra ändå. Med andra ord gör den här renderingen inte något som inte skulle hända utan det. Allt det gör är att visa någon kod som vanligtvis bara är "antagen".

 def index render: action => 'index' slut

Göra en åtgärd till en annan vy

Det sista exemplet är inte särskilt användbart eftersom resultatet ändå uppnås automatiskt ändå. Men om du hade en riktigt avancerad vy för en annan åtgärd, och du ville ha samma uppfattning för en annan åtgärd. Det är inte bara tråkigt att skapa en annan identisk vy för varje åtgärd du skapar, men det skulle också vara nästan omöjligt att uppdatera! Allt detta kan lösas genom att göra varje liknande åtgärd till en specifik åtgärd. Undersök följande kodstycke som jag kommer att förklara efteråt och märka de olika delarna.

text_controller.rb:

 klass LearnController < ApplicationController def index render :action => 'text' avsluta def text @text = 'Text'sluta def andra @text ='Andra'render: action =>' text 'slutet

text.html.erb:

   Rails Rendering Demo 

Välkommen till <%= @text %> Sida

Förklaring av kod:

Index Action

Du kanske har märkt att jag inkluderade en åtgärd som heter "index". Denna åtgärd kommer att ses om du går upp i en katalog för att "lära". Det fungerar som en vanlig indexfil skulle. Du behöver dock inte skapa en specifik åtgärd för index. Du kan använda det tidigare täckta ämnet för att ärva en annan åtgärd också.

Återgivning till samma vy

För detta exempel behövde vi bara en vy för alla åtgärder. och de producerade alla olika sidor. För mig är detta ganska otroligt för hur mycket arbete vi lägger in.

Obs! Det här kan verka självklart för vissa, men akta dig för dubbla rendering. Double rendering orsakar ett fel eftersom du försöker göra en åtgärd på två olika platser. Kan du vara på två ställen samtidigt? Nej, och inte heller en åtgärd. Om du vill se hur det ser ut, gör bara en åtgärd i två olika vyer. Anledningen till att det händer när du gör mer komplexa projekt är att åtgärden kan bli ganska komplex, och du kan oavsiktligt skapa detta fel.

Se till att du får det grundläggande konceptet att göra, eftersom det kommer att bli en väldigt viktig teknik som du ofta kommer att använda som en railsutvecklare.

Omdirigera en åtgärd

Omdirigera en åtgärd liknar att göra en åtgärd i det faktum att det också är skenor kod och används endast i kontrollenheten. Dessutom påverkar det flödet av applikationen. Som du kan gissa från namnet kan du omdirigera ... omdirigera omdirigering.

Du kan bli förvånad över hur många gånger du använder omdirigeringskommandot. Här är några vanliga användningsområden:

  • Skapa alias sidor
  • Utföra en åtgärd i kontrollenheten och sedan omdirigera till en sekundär sida
  • Om det finns ett fel, omdirigera till en fel sida
  • Om användaren inte är inloggad skickar du dem till en inloggningssida

Nok chit chatt, låt oss komma till koden! För det här koden exemplet kommer vi bara att ändra det senaste exemplets kontroller och lämna synvinkeln samma. Som du kan se är omdirigering mycket liknande i format som ska återges:

 klass LearnController < ApplicationController def index redirect_to :action => 'text' avsluta def text @text = 'Text'redirect_to: action =>' other 'end def andra render: action =>' text 'slutet

Gå nu till indexåtgärden i din webbläsare. Du kommer märka att du hamnar i den andra åtgärden i adressfältet. Låt oss köra igenom den här koden:

  • Först omdirigerar vi oss till åtgärdstexten. Precis som att länka i skenor kan du också ange en kontroller om du vidarebefordrar till en annan styrenhet. Du skulle bara sätta: controller => 'lära', innan åtgärden.
  • Webbläsaren går nu till textåtgärden. Här ställer det ett värde för @text. Men webbläsaren har inget värde för @text. Det här beror på att omdirigering åtminstone glömmer allt du säger i den åtgärden.
  • Vi vidarebefordras nu till andra. Här återges texten i textvisningen.

Render eller Omdirigera?

Medan det finns några uppenbara scenarier där du skulle välja att göra eller omdirigera; det kan finnas några hårdare beslut. En viktig nyckel är dock att om du skickar data till en databas eller något som ändrar programmet, använd en omdirigering. Annars kan en uppdatering sända data igen.

Slutgiltiga tankar

Hoppas att ni lärde mig mycket av den här veckans handledning! Vi omfattade många viktiga begrepp, så om du fortfarande är förvirrad av någonting, läs den igen. Nästa vecka kommer vi antagligen att gå in i ruby ​​syntax!

Som alltid, var god att lämna frågor i kommentarerna. Också, snälla gradera denna artikel om den hjälpte dig!