edge
Daugiau informacijos rubyonrails.org: Daugiau apie Ruby on Rails

Veiksmo peržiūros apžvalga

Perskaitę šį vadovą, žinosite:

1 Kas yra Action View?

„Rails“ programoje interneto užklausos apdorojamos naudojant Action Controller ir Action View. Paprastai Action Controller yra susijęs su duomenų bazės sąveika ir atlieka CRUD veiksmus, jei reikia. Tada Action View atsakingas už atsakymo sudarymą.

Action View šablonai rašomi naudojant įterptą Ruby kodą, sumaišytą su HTML žymėmis. Norint išvengti šablonų užteršimo pagrindiniu kodu, kelios pagalbinės klasės teikia bendrą elgesį formoms, datoms ir eilutėms. Taip pat lengva pridėti naujus pagalbinius įrankius prie jūsų programos, kai ji tobulėja.

PASTABA: Kai kurie Action View funkcionalumai yra susiję su Active Record, tačiau tai nereiškia, kad Action View priklauso nuo Active Record. Action View yra nepriklausomas paketas, kurį galima naudoti su bet kokiomis Ruby bibliotekomis.

2 Naudodami Action View su „Rails“

Kiekvienam valdikliui yra susijusi direktorija app/views direktorijoje, kurioje yra šablonų failai, sudarantys su tuo valdikliu susijusius rodinius. Šie failai naudojami rodiniui, kuris gaunamas iš kiekvieno valdiklio veiksmo, atvaizduoti.

Pažiūrėkime, ką „Rails“ pagal nutylėjimą daro, kai sukuriamas naujas išteklius naudojant šablonų generatorių:

$ bin/rails generate scaffold article
      [...]
      invoke  scaffold_controller
      create    app/controllers/articles_controller.rb
      invoke    erb
      create      app/views/articles
      create      app/views/articles/index.html.erb
      create      app/views/articles/edit.html.erb
      create      app/views/articles/show.html.erb
      create      app/views/articles/new.html.erb
      create      app/views/articles/_form.html.erb
      [...]

„Rails“ yra vardų konvencija rodiniams. Paprastai rodiniai dalina savo pavadinimą su susijusiu valdiklio veiksmu, kaip matote aukščiau. Pavyzdžiui, articles_controller.rb indekso valdiklio veiksmas naudos index.html.erb šablonų failą app/views/articles direktorijoje. Visas HTML, grąžinamas klientui, sudaro šio ERB failo, jį apgaubiančio išdėstymo šablono ir visų dalinių, į kurias gali nuorodą rodinys, kombinacija. Šiame vadove rasite išsamesnę dokumentaciją apie šiuos tris komponentus.

Kaip minėta, galutinis HTML išvestis yra trijų „Rails“ elementų - šablonų, dalinių ir išdėstymų - kompozicija. Žemiau pateikiama trumpa kiekvieno iš jų apžvalga.

3 Šablonai

Action View šablonus galima rašyti keliais būdais. Jei šablonų failas turi .erb plėtinį, jis naudoja sumaištį iš ERB (įterpto Ruby) ir HTML. Jei šablonų failas turi .builder plėtinį, naudojama Builder::XmlMarkup biblioteka.

„Rails“ palaiko kelias šablonų sistemas ir naudoja failo plėtinį, kad jas atskirtų. Pavyzdžiui, HTML failas, naudojantis ERB šablonų sistemą, turės .html.erb kaip failo plėtinį.

3.1 ERB

ERB šablone galima įtraukti Ruby kodą naudojant <% %> ir <%= %> žymes. <% %> žymės naudojamos vykdyti Ruby kodą, kuris nieko negrąžina, pvz., sąlygas, ciklus ar blokus, o <%= %> žymės naudojamos, kai norite gauti išvestį.

Pavyzdžiui, apsvarstykite šį ciklą vardams:

<h1>Visų žmonių vardai</h1>
<% @people.each do |person| %>
  Vardas: <%= person.name %><br>
<% end %>

Ciklas sukuriamas naudojant įprastas įterpimo žymes (<% %>) ir vardas įterpiamas naudojant išvesties įterpimo žymes (<%= %>). Atkreipkite dėmesį, kad tai ne tik naudojimo rekomendacija: įprastos išvesties funkcijos, pvz., print ir puts, nebus atvaizduojamos šablonui su ERB šablonais. Taigi tai būtų neteisinga:

<%# NETEISINGA %>
Sveiki, pone. <% puts "Frodo" %>

Norint slopinti pradines ir galines tarpines tarpas, galite naudoti <%- -%> kaip <% ir %>.

3.2 Builder

Builder šablonai yra programiškai orientuotas variantas ERB. Jie ypač naudingi generuojant XML turinį. Šablonams su .builder plėtiniu automatiškai prieinamas XmlMarkup objektas, vardu xml.

Štai keletas pagrindinių pavyzdžių:

xml.em("paryškintas")
xml.em { xml.b("paryškintas ir storas") }
xml.a("Nuoroda", "href" => "https://rubyonrails.org")
xml.target("name" => "kompiliuoti", "option" => "greitai")

kas sukurtų:

<em>paryškintas</em>
<em><b>paryškintas ir storas</b></em>
<a href="https://rubyonrails.org">Nuoroda</a>
<target option="greitai" name="kompiliuoti" />

Bet kuri metodas su bloku bus laikomas XML žyma su įterptu žymėjimu bloke. Pavyzdžiui, šis: ruby xml.div { xml.h1(@person.name) xml.p(@person.bio) }

sukurtų kažką panašaus į:

<div>
  <h1>David Heinemeier Hansson</h1>
  <p>A product of Danish Design during the Winter of '79...</p>
</div>

Žemiau yra pilnas RSS pavyzdys, kuris buvo naudojamas Basecamp:

xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do
  xml.channel do
    xml.title(@feed_title)
    xml.link(@url)
    xml.description "Basecamp: Naujausi elementai"
    xml.language "en-us"
    xml.ttl "40"

    for item in @recent_items
      xml.item do
        xml.title(item_title(item))
        xml.description(item_description(item)) if item_description(item)
        xml.pubDate(item_pubDate(item))
        xml.guid(@person.firm.account.url + @recent_items.url(item))
        xml.link(@person.firm.account.url + @recent_items.url(item))
        xml.tag!("dc:creator", item.author_name) if item_has_creator?(item)
      end
    end
  end
end

3.3 Jbuilder

Jbuilder yra "gem", kurį palaiko Rails komanda ir jis yra įtrauktas į numatytąjį Rails Gemfile. Jis panašus į Builder, bet naudojamas generuoti JSON, o ne XML.

Jei neturite jo, galite pridėti šį kodą į savo Gemfile:

gem 'jbuilder'

Jbuilder objektas, pavadinimu json, automatiškai tampa prieinamas šablonams su .jbuilder plėtiniu.

Štai pagrindinis pavyzdys:

json.name("Alex")
json.email("[email protected]")

sukurtų:

{
  "name": "Alex",
  "email": "[email protected]"
}

Daugiau pavyzdžių ir informacijos rasite Jbuilder dokumentacijoje.

3.4 Šablonų kešavimas

Pagal numatymą, Rails kompiliuos kiekvieną šabloną į metodą, kad jį galėtų atvaizduoti. Vystymo aplinkoje, kai keičiate šabloną, Rails patikrins failo modifikavimo laiką ir jį iš naujo sukompiliuos.

4 Dalys

Dalinius šablonus - paprastai vadinamus "dalimis" - galima naudoti, norint padalinti atvaizdavimo procesą į lengviau valdomas dalis. Su dalimis galite išskirti kodo gabalus iš savo šablonų į atskirus failus ir juos perpanaudoti visuose šablonuose.

4.1 Dalinių šablonų atvaizdavimas

Norėdami atvaizduoti dalinį kaip dalį šablono, naudokite render metodą šablone:

<%= render "menu" %>

Tai atvaizduos failą, pavadinimu _menu.html.erb, šablono vietoje, kuris yra atvaizduojamas. Pastebėkite priešakyje esantį pabraukimo ženklą: daliniai yra pavadinti su priešakyje esančiu pabraukimo ženklu, kad juos būtų galima atskirti nuo įprastų šablonų, nors jie yra paminėti be pabraukimo ženklo. Tai taip pat galioja net tuomet, kai dalį ištraukiate iš kitos aplanko:

<%= render "shared/menu" %>

Tas kodas įtrauks dalinį iš app/views/shared/_menu.html.erb.

4.2 Daliniais supaprastinami šablonai

Vienas būdas naudoti dalis yra traktuoti jas kaip subrutinas; tai būdas iškelti detales iš šablono, kad galėtumėte lengviau suprasti, kas vyksta. Pavyzdžiui, galite turėti šabloną, kuris atrodo taip:

<%= render "shared/ad_banner" %>

<h1>Produktai</h1>

<p>Čia yra keletas mūsų puikių produktų:</p>
<% @products.each do |product| %>
  <%= render partial: "product", locals: { product: product } %>
<% end %>

<%= render "shared/footer" %>

Čia _ad_banner.html.erb ir _footer.html.erb daliniai gali turėti turinį, kuris bendrinamas daugelyje jūsų aplikacijos puslapių. Jums nereikia matyti šių skyrių detalių, kai sutelkiate dėmesį į konkretų puslapį.

4.3 render be partial ir locals parametrų

Pirmiau pateiktame pavyzdyje render priima 2 parametrus: partial ir locals. Bet jei norite perduoti tik šiuos parametrus, galite nejuo naudotis. Pavyzdžiui, vietoj:

<%= render partial: "product", locals: { product: @product } %>

Galite naudoti:

<%= render "product", product: @product %>

4.4 as ir object parametrai

Pagal numatymą, ActionView::Partials::PartialRenderer turi savo objektą vietiniame kintamajame, turinčiame tą patį pavadinimą kaip šablonas. Taigi, turint:

<%= render partial: "product" %>

daliniame _product mes gausime @product vietiniame kintamajame product, tarsi būtume parašę:

<%= render partial: "product", locals: { product: @product } %>

object parametrą galima naudoti, norint tiesiogiai nurodyti, kuris objektas yra atvaizduojamas dalinyje; tai naudinga, kai šablono objektas yra kitur (pvz., skirtingame objekto kintamajame arba vietiniame kintamajame).

Pavyzdžiui, vietoj:

<%= render partial: "product", locals: { product: @item } %>

darytume:

<%= render partial: "product", object: @item %>

Naudojant as parametrą, galime nurodyti kitą pavadinimą šiam vietiniam kintamajam. Pavyzdžiui, jei norėtume, kad jis būtų item, o ne product, darytume:

<%= render partial: "product", object: @item, as: "item" %>

Tai yra ekvivalentu erb <%= render partial: "product", locals: { item: @item } %>

4.5 Rodomi kolekcijos

Dažnai šablonui reikės iteruoti per kolekciją ir atvaizduoti sub-šabloną kiekvienam elementui. Šis modelis yra įgyvendintas kaip vienas metodas, kuris priima masyvą ir atvaizduoja dalinį šabloną kiekvienam masyvo elementui.

Taigi, šis pavyzdys, skirtas visiems produktams atvaizduoti:

<% @products.each do |product| %>
  <%= render partial: "product", locals: { product: product } %>
<% end %>

gali būti parašytas vienoje eilutėje:

<%= render partial: "product", collection: @products %>

Kai dalinis yra iškviečiamas su kolekcija, atskiriems dalinio atvejams prieiga prie atvaizduojamos kolekcijos nario suteikiama per kintamąjį, kurio pavadinimas yra dalinio pavadinimas. Šiuo atveju dalinis yra _product, o jame galite naudoti product, kad gautumėte atvaizduojamą kolekcijos narį.

Galite naudoti trumpą sintaksę, skirtą kolekcijų atvaizdavimui. Tarkime, kad @products yra Product objektų kolekcija, galite tiesiog parašyti šį kodą, kad gautumėte tą patį rezultatą:

<%= render @products %>

Rails nustato dalinio pavadinimą, žiūrėdamas modelio pavadinimą kolekcijoje, šiuo atveju Product. Iš tikrųjų, netgi galite atvaizduoti kolekciją, sudarytą iš skirtingų modelių objektų, naudodami šią trumpą sintaksę, ir Rails pasirinks tinkamą dalinį kiekvienam kolekcijos nariui.

4.6 Tarpiklio šablonai

Taip pat galite nurodyti antrą dalinį, kuris bus atvaizduojamas tarp pagrindinių dalinių, naudodami :spacer_template parinktį:

<%= render partial: @products, spacer_template: "product_ruler" %>

Rails atvaizduos _product_ruler dalinį (be perduodamų duomenų) tarp kiekvienos _product dalinės poros.

4.7 Griežtos vietinės reikšmės

Pagal numatytuosius nustatymus šablonai priims bet kokias vietines reikšmes kaip raktinius argumentus. Norėdami apibrėžti, kokias vietines reikšmes šablonas priima, pridėkite locals magišką komentarą:

<%# locals: (message:) -%>
<%= message %>

Numatytosios reikšmės taip pat gali būti pateiktos:

<%# locals: (message: "Hello, world!") -%>
<%= message %>

Arba vietinės reikšmės gali būti visiškai išjungtos:

<%# locals: () %>

5 Maketai

Maketos gali būti naudojamos atvaizduoti bendrą vaizdo šabloną aplink Rails kontrolerio veiksmų rezultatus. Paprastai Rails aplikacijoje bus keletas maketų, kuriuose bus atvaizduojamos puslapiai. Pavyzdžiui, svetainėje gali būti vienas maketas prisijungusiems vartotojams ir kitas rinkodaros ar pardavimų svetainės puslapiams. Prisijungusių vartotojų maketas gali apimti viršutinį lygio naršymą, kuris turėtų būti matomas daugelyje kontrolerio veiksmų. SaaS aplikacijos pardavimų maketas gali apimti viršutinį lygio naršymą, skirtą dalykams, tokiam kaip "Kainos" ir "Susisiekite su mumis" puslapiai. Kiekvienam maketui tikėtumėte turėti skirtingą išvaizdą ir jausmą. Daugiau informacijos apie maketus galite rasti Maketų ir atvaizdavimo Rails vadove.

5.1 Dalinių maketai

Daliniai gali turėti savo maketus. Šie maketai skiriasi nuo tų, kurie taikomi kontrolerio veiksmui, tačiau jie veikia panašiu būdu.

Tarkime, kad rodome straipsnį puslapyje, kuris turėtų būti apgaubtas div tikslais. Pirmiausia sukursime naują Article:

Article.create(body: 'Daliniai maketai yra šaunūs!')

show šablone atvaizduosime _article dalinį, apgaubtą box maketu:

articles/show.html.erb

<%= render partial: 'article', layout: 'box', locals: { article: @article } %>

box maketas tiesiog apgaubia _article dalinį div:

articles/_box.html.erb

<div class='box'>
  <%= yield %>
</div>

Atkreipkite dėmesį, kad dalinio maketas turi prieigą prie vietinio article kintamojo, kuris buvo perduotas render iškvietime. Tačiau, skirtingai nuo visoje aplikacijoje naudojamų maketų, dalinių maketai vis dar turi priešdėlį _.

Taip pat galite atvaizduoti kodo bloką dalinio makete, vietoj to, kad būtų iškviesta yield. Pavyzdžiui, jei neturėtume _article dalinio, galėtume tai padaryti:

articles/show.html.erb

<% render(layout: 'box', locals: { article: @article }) do %>
  <div>
    <p><%= article.body %></p>
  </div>
<% end %>

Tarkime, kad naudojame tą patį _box dalinį, kaip ir ankstesniame pavyzdyje, tai gautume tą patį rezultatą.

6 Vaizdo keliai

Atvaizduojant atsaką, kontroleris turi nustatyti, kur yra skirtingi vaizdai. Pagal numatytuosius nustatymus jis žiūri tik į app/views katalogą. Mes galime pridėti kitas vietas ir suteikti jiems tam tikrą pirmenybę, kai išsprendžiame kelius naudodami prepend_view_path ir append_view_path metodus.

6.1 Pridėti peržiūros kelią

Tai gali būti naudinga, pavyzdžiui, kai norime įdėti peržiūras į kitą aplanką subdomenams.

Tai galime padaryti naudodami:

prepend_view_path "app/views/#{request.subdomain}"

Tada Action View pirmiausia ieškos šiame aplanke, kai išsprendžia peržiūras.

6.2 Pridėti peržiūros kelią

Panašiai, galime pridėti kelius:

append_view_path "app/views/direct"

Tai pridės app/views/direct į paieškos kelio pabaigą.

7 Pagalbinės funkcijos

Rails teikia daug pagalbinių metodų, skirtų naudoti su Action View. Tai apima metodus, skirtus:

  • Datos, eilučių ir skaičių formatavimui
  • Kūrimui HTML nuorodas į paveikslėlius, vaizdo įrašus, stilių lapus ir kt.
  • Turinio dezinfekavimui
  • Formų kūrimui
  • Turinio lokalizavimui

Daugiau apie pagalbinius metodus galite sužinoti Action View Helpers Gidą ir Action View Form Helpers Gidą.

8 Lokalizuotos peržiūros

Action View gali atvaizduoti skirtingus šablonus priklausomai nuo dabartinės lokalės.

Pavyzdžiui, tarkime, turite ArticlesController su rodyti veiksmu. Pagal numatytuosius nustatymus, šio veiksmo iškvietimas atvaizduos app/views/articles/show.html.erb. Bet jei nustatysite I18n.locale = :de, tada bus atvaizduotas app/views/articles/show.de.html.erb. Jei lokalizuotas šablonas nėra, bus naudojamas neapipavidalintas versijos. Tai reiškia, kad nereikia pateikti lokalizuotų peržiūrų visais atvejais, bet jos bus pirmenybės ir naudojamos, jei yra.

Galite naudoti tą patį metodą, kad lokalizuotumėte gelbėjimo failus savo viešajame aplanke. Pavyzdžiui, nustatant I18n.locale = :de ir sukūrus public/500.de.html ir public/404.de.html, galėsite turėti lokalizuotus gelbėjimo puslapius.

Kadangi „Rails“ neapriboja simbolių, kuriuos naudojate nustatydami I18n.locale, galite pasinaudoti šia sistema, kad rodytumėte skirtingą turinį, priklausomai nuo bet ko, kas jums patinka. Pavyzdžiui, tarkime, turite kai kuriuos „ekspertus“, kurie turėtų matyti skirtingus puslapius nei „normalūs“ vartotojai. Galėtumėte pridėti šį kodą į app/controllers/application_controller.rb:

before_action :set_expert_locale

def set_expert_locale
  I18n.locale = :expert if current_user.expert?
end

Tada galėtumėte sukurti specialias peržiūras, pvz., app/views/articles/show.expert.html.erb, kurios būtų rodomos tik ekspertams.

Daugiau apie „Rails“ tarptautinės lokalizacijos (I18n) API galite skaityti čia.

Atsiliepimai

Jūs esate skatinami padėti pagerinti šio vadovo kokybę.

Prašome prisidėti, jei pastebite rašybos klaidų ar faktinių klaidų. Norėdami pradėti, galite perskaityti mūsų dokumentacijos prisidėjimo skyrių.

Taip pat gali būti nepilnos informacijos arba informacijos, kuri nėra atnaujinta. Prašome pridėti bet kokią trūkstamą dokumentaciją pagrindiniam. Patikrinkite Edge vadovus pirmiausia, ar problemas jau išspręsta arba ne pagrindinėje šakoje. Patikrinkite Ruby on Rails vadovų gaires dėl stiliaus ir konvencijų.

Jei dėl kokios nors priežasties pastebite kažką, ką reikia ištaisyti, bet negalite patys tai pataisyti, prašome pranešti apie problemą.

Ir galiausiai, bet ne mažiau svarbu, bet koks diskusijos dėl Ruby on Rails dokumentacijos yra labai laukiamos oficialiame Ruby on Rails forume.