Projektis oli vaja sisse logida erinevat tüüpi seadmete jaoks modaalakende ja "tavaliste" lehtede kaudu. Pärast otsimist sain aru, et see, mida sageli kirjeldatakse, pole just see, mida vaja. Nii et nad asetavad vormi lihtsalt modaalsesse aknasse (tegelikult kasutades ) ja siin (sisselogimine ja registreerimine) alistavad nad väljatöötamise kontrollerites olevad meetodid, nii et nad tagastavad alati ainult json-i ja "mittemodaalse" käitumise jaoks peate kirjutama palju tingimusi päringu vormingu kontrollimisel. Seega otsustasin katsetada uue rakendusega ja kirjutada tuge kahele vormingule, millel on minimaalne ülekaal ja määrdunud häkkimine.

Rakenduse loomine

  1. Loome rakenduse ilma testideta ja käivitame komplekti installimine: rööpad uus devise_modal -B -T
  2. Lisage vajalikud kalliskivid Gemfile:

    Ja installige kõik: komplektinstallimine

  3. Käivitame vajalikud generaatorid
    rails g bootstrap: installi staatiline , "staatiline", kuna stiilides pole vaja midagi muuta bootstrap"ärme
    rööpad g kavandama:installima; rööpad g kavandama Kasutaja; rake db:migrate – installi välja mõelda ja luua kasutaja
  4. Looge kontroller, mis kuvab avalehe:
    rööpad g kontrolleri tervitusindeks --no-helper --no-assets
    IN config/routes.rb lips indeks avalehele:
    juur "tere #index"
Selle etapi lõpus on taotlus, mille standardsetel linkidel on sisselogimis-/registreerimisvormid välja mõelda: users/sign_in ja users/sign_up .

Modaalsed aknad vormidele

Vormides pole midagi tähelepanuväärset – kasutame standardseid välja mõelda"ovskie on need teinud kaugjuhtimispult ja vormingu muutmine json. Järgmisena muudame need modaalseks, pakkides need sobivatesse klassidesse bootstrap"Ah, lõpuks läks nii osaline"s:




Lisame nende failide kuva ja lingid, et neid sisse kutsuda paigutus:
<%= link_to "Sign in", "#sign_in", "data-toggle" =>"modaalne", :class => "btn btn-small" %><%= link_to "Sign up", "#sign_up", "data-toggle" =>"modaalne", :class => "btn btn-small" %><%= render "shared/sign_in" %> <%= render "shared/sign_up" %>
Ja pärast seda parandame seda veidi, kontrollides kasutaja kohalolekut:
app/views/layouts/application.html.erb
<% if current_user %> <%= "Hello, #{current_user.email}" %> <%= link_to "Sign out", destroy_user_session_path, :method =>:kustuta %><% else %> <%= link_to "Sign in", "#sign_in", "data-toggle" =>"modaalne", :class => "btn btn-small" %><%= link_to "Sign up", "#sign_up", "data-toggle" =>"modaalne", :class => "btn btn-small" %><%= render "shared/sign_in" %> <%= render "shared/sign_up" %> <% end %>
Selle toimimiseks peate lisama mitu meetodit rakenduse_abistaja, mis määravad ressurss ja sellega seotud selle konteksti jaoks:
app/helpers/application_helper.rb
def ressursi_nimi:kasutaja lõpp def ressurss @ressurss ||= User.new end def devise_mapping @devise_mapping ||= Devise.mappings[:user] end
Nagu printercu ja DarthSim kommentaarides märkisid, määratlege globaalsed abistajad uuesti ressurss pole mõtet, parem on see otse vormidesse seada ressurss- User.new ja selle asemel ressursi_nimi- :kasutaja. ka sisse app/views/shared/_sign_in.html.erb määrame selle asemel Devise.mappings[:user] devise_mapping. Üldiselt saate sellest seisundist täielikult lahti saada:<% if devise_mapping.rememberable? -%>selle põhjal, kas me määrame mudelis kasutaja ( app/models/user.rb): meeldejääv. Pealegi sisse app/views/shared/_sign_up.html.erb oli ka abimees devise_error_messages!, mis kasutab ressurss, kuid kuna veatekst on võetud json"ja vastus, siis kustutame selle lihtsalt vormist<%= devise_error_messages! %>kui ebavajalik.
Nüüd on olemas modaalsed vormid, millele pääseb juurde igalt lehelt ja mis võimaldavad teil sisse logida ja registreeruda. Kõik, mis teha jääb, on teha välja mõelda Ma ei saatnud nendele päringutele vastuseks html-lehti.

JSON-i vastused seadmest

Kalliskivis välja mõelda FailureApp vastutab sisselogimisega seotud vigade eest. Kui ilmneb viga SessionsController"e, mis töötleb sisselogimispäringuid, nimetatakse vastuseks , kus http_auth? kasutades on märgitud: peate saatma 401 oleku või suunama teisele lehele. Kuna vaikimisi välja mõelda"A:
config/initializers/devise.rb
config.http_authenticatable_on_xhr = true, siis tagastatakse 401.
RegistrationsController saadab vastuseks AJAX-i päringule html-lehe; selle parandamiseks defineerime seda veidi ümber – anname selgesõnaliselt märku, millistest vormingutest meid huvitavad:
rööpad g kontroller Registreeringud --no-helper --no-assets --no-views
config/routes.rb
devise_for:users, controllers: (registreeringud: "registratsioonid")
app/controllers/registrations_controller.rb
klassi RegistrationsController< Devise::RegistrationsController respond_to:html, :json end
Nüüd, kui registreerimiskatse ebaõnnestub, tagastatakse 422 olek koos veatekstidega vastusJSON["vead"], ja kui see õnnestub - 201. Samamoodi jaoks SessionsController"ja edukal sisselogimisel peate määrama oleku, mitte html-lehe, nii et me "õpetame" talle, kuidas õigesti reageerida json taotlused:
rööpad g kontroller Seansid --no-helper --no-assets --no-views
config/routes.rb
devise_for:users, controllers: (seansid: "seansid", registreerimised: "registratsioonid")
app/controllers/sessions_controller.rb
klassi SessionsController< Devise::SessionsController respond_to:html, :json end
Võib ka kirjutada javascript, mis töötleb modaalvormide vastuseid, näiteks:
app/assets/javascripts/welcome.js.coffee
$ -> $("form#sign_in_user, form#sign_up_user").bind("ajax:success", (sündmus, xhr, seaded) -> $(this).parents(.modal").modal("hide ")).bind("ajax:error", (sündmus, xhr, seaded, erandid) -> error_messages = if xhr.responseJSON["viga"] "
" + xhr.responseJSON["viga"] + "
" else if xhr.responseJSON["vead"] $.map(xhr.responseJSON["vead"], (v, k) -> "
" + k + " " + v + "
").liitu "" muu "
Tundmatu viga
" $(this).parents(".modal").children(.modal-footer").html(error_messages))
Sisselogimisel mähkige viga sisse hoiatus, ja registreerimisel - iga parameetri vead, mille järel kuvame vastuvõetud teate jalus Kui taotlus on edukas, eemaldame lihtsalt modaalvormi (saate ka plokki värskendada paigutus"e, milles kontrollitakse kasutaja kohalolekut, et kuvada kasutajaandmeid (need tulevad ka vastuses)).
Nüüd pakuvad kontrollerid vastuseid õiges vormingus, täpselt nagu modaalvormide puhul – json ja standardse ( kasutajad/sisselogimine, kasutajad/registreerumine) - html. Ja selleks oli vaja vaid kontrollerite ümberdefineerimist, laiendades vormingute komplekti:
answer_to:html, :json
Märge
Rakendus on kirjutatud rööbastes 4, kuid erinevused 3.2 puhul on minimaalsed: rakenduse loomisel käivitatakse komplekti installimine, peate kustutama public/index.html ja avalehe tee näeb välja veidi erinev:
config/routes.rb
root to: "welcome#index" PHP_INI_* konstantide üksikasjalikku kirjeldust leiate jaotisest Kus saab seadistada konfiguratsioonisuvandeid.

Konfiguratsioonidirektiivide lühiselgitus.

Määrab vea logimise taseme. Parameeter võib olla kas bitivälja tähistav arv või nimega konstant. Vastavad tasemed ja konstandid on toodud jaotises Eelmääratletud konstandid, samuti failis php.ini. Seade seadistamiseks käitusajal kasutage funktsiooni error_reporting(). Vaata ka direktiivi display_errors kirjeldust.

PHP 5.3 ja uuemates versioonides on vaikeväärtus E_ALL & ~E_MÄRKUS & ~E_STRICT & ~E_DEPRECATED. Selle sätte korral veatasemeid ei kuvata E_MÄRKUS, E_STRICT Ja E_DEPRECATED. Saate neid arenduse ajal kuvada. Enne PHP 5.3.0 oli vaikeväärtus E_ALL & ~E_MÄRKUS & ~E_STRICT. PHP 4-s oli vaikimisi E_ALL & ~E_MÄRKUS.

Kommenteeri:

Kaasamine E_MÄRKUS arendamise ajal on mitmeid eeliseid. Silumiseks: MÄRKUS-teated võivad hoiatada koodi võimalike vigade eest. Näiteks initsialiseerimata muutujate kasutamine põhjustab sarnase teate. See on väga kasulik kirjavigade leidmisel ja säästab aega silumisel. MÄRKUS-teated hoiatavad ka halva stiili eest. Näiteks, $arr Parem on kirjutada nii: $arr["üksus"] alates sellest, kui PHP hakkas tõlkima "kaup" konstantina. Kui see ei ole konstant, võtab PHP selle avaldise massiivi elemendi stringiindeksina.

Kommenteeri:

PHP 5-l on saadaval uus veatase E_STRICT. Sest E_STRICT ei sisalda E_ALL, peate selle veataseme selgesõnaliselt lubama. Kaasamine E_STRICT arendamise ajal on ka oma eelised. STRICT sõnumid pakuvad näpunäiteid, mis aitavad tagada teie koodi parema funktsionaalsuse ja tagasiühilduvuse. Need sõnumid võivad sisaldada selliseid asju nagu mittestaatiliste meetodite staatiline kutsumine, atribuutide määratlemine ühilduvas klassis, kui need on kasutatavas tunnuses juba defineeritud, ja enne PHP 5.3 võivad mõned aegunud funktsioonid tekitada ka tasemevigu. E_STRICT, näiteks objektide määramine eksemplari loomisel viitega.

Kommenteeri: PHP konstandid väljaspool PHP-d

PHP konstantide kasutamine väljaspool PHP-d, näiteks failis httpd.conf, ei ole mõttekas, kuna sellistel juhtudel on vaja täisarvu väärtusi ( täisarv). Lisaks lisatakse aja jooksul uued veatasemed ja konstandi maksimaalne väärtus E_ALL kasvab vastavalt. Seetõttu kohas, kuhu peaksite osutama E_ALL, on parem määrata suur täisarv, et katta kõik võimalikud bitiväljad. See number võib olla näiteks 2147483647 (see hõlmab kõiki võimalikke vigu, mitte ainult E_ALL).

kuva_vead string

See säte määrab, kas vead kuvatakse koos ülejäänud väljundiga või tuleb vead kasutaja eest peita.

Tähendus "stderr" saadab vead voogu stderr selle asemel stdout. Väärtus on saadaval PHP 5.2.4-s. Varasemates versioonides oli selle direktiivi tüüp tõeväärtus.

Kommenteeri:

See funktsioon on mõeldud ainult arendamiseks ja seda ei tohiks kasutada tootmissüsteemides (näiteks Interneti-juurdepääsuga süsteemid).

Kommenteeri:

Kuigi display_errors saab määrata käitusajal ( ini_set()), ei mõjuta see midagi, kui skriptis on saatuslikke vigu. See on tingitud asjaolust, et programmi eeldatavad toimingud täitmise ajal ei saa kontrolli (ei teostata).

display_startup_errors tõeväärtus

Isegi kui display_errors on lubatud, ei kuvata PHP käivitamisel ilmnevaid vigu. Soovitame tungivalt lubada direktiiv display_startup_errors ainult silumise eesmärgil.

Logi_errors tõeväärtus

Vastutab logi valimise eest, kuhu veateated salvestatakse. See võib olla serveri logi või error_log. Selle sätte rakendatavus sõltub konkreetsest serverist.

log_errors_max_len täisarv

Määrab log_errors maksimaalse pikkuse baitides. Teave allika kohta lisatakse faili error_log. Vaikeväärtus on 1024. Väärtuse määramine 0-le eemaldab log_errors pikkuse piirangu. See piirang kehtib logitud vigade, kuvatud vigade ja $php_errormsg kohta.

Kui kasutatakse täisarv, mõõdetakse väärtust baitides. Võite kasutada ka stenogrammi, mida kirjeldatakse selles KKK-s. ignore_repeated_errors tõeväärtus

Ärge logige korduvaid vigu. Viga loetakse korduvaks veaks, kui see esineb samas failis ja samal real ning kui säte on keelatud.

Ignoreeri_korduvat_allikat tõeväärtus

Duplikaatsõnumite vahelejätmisel ignoreerige tõrkeallikat. Kui see säte on lubatud, siis dubleerivaid veateateid ei logita, olenemata sellest, millistel failidel või ridadel need esinevad.

Report_memleaks tõeväärtus

Kui säte on lubatud (vaikeseade), koostatakse Zend mäluhalduri tuvastatud mälulekete kohta aruanne. POSIX platvormidel saadetakse see aruanne aadressile stderr. Windowsi platvormidel saadetakse see silurile funktsiooni OutputDebugString() abil; sel juhul saate aruannet vaadata utiliitide, näiteks "DbgView" abil. See säte on mõttekas silumiseks mõeldud järgudes. Kus E_HOIATUS tuleb lisada veateadete loendisse.

Track_errors tõeväärtus

Kui see on lubatud, on viimane ilmnenud viga muutuja $php_errormsg esimene.

Html_errors tõeväärtus

Keelab veateadetes HTML-märgendid. Uus HTML-i veateatevorming annab võimaluse sisestada sõnumitesse linke ja suunata kasutaja vealehtedele. Selliste linkide eest vastutavad docref_root ja docref_ext.

Xmlrpc_errors tõeväärtus

Lülitab veateate vormingu XML-RPC sõnumivormingule.

Xmlrpc_vea_number täisarv

Kasutatakse XML-RPC faultCode elemendi väärtusena.

Docref_root string

Uus veavorming sisaldab linki lehele, mis kirjeldab tõrke põhjustanud viga või funktsiooni. Saate paigutada tõrke ja funktsioonide kirjelduste koopia lokaalselt ja määrata ini direktiivi selle koopia URL-ile. Kui näiteks kirjelduste kohalik koopia on saadaval aadressil "/manual/", lihtsalt kirjuta docref_root=/manual/. Lisaks peate määrama direktiivi docref_ext väärtuse, mis vastutab faililaiendite sobitamise eest teie kohaliku koopia kirjeldusfailidega, docref_ext=.html. Võimalik on kasutada ka välislinke. Näiteks, docref_root=http://manual/en/ või docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon &url=http%3A%2F%2Fwww.php.net%2F"

Enamikul juhtudel soovite, et docref_root väärtus lõppeks kaldkriipsuga "/" . Siiski on aegu, mil seda ei nõuta (vt teist näidet eespool).

Kommenteeri:

See funktsioon on mõeldud ainult arenduseks, kuna see muudab funktsioonide kirjelduste ja vigade leidmise lihtsamaks. Ärge kasutage seda valmistootmissüsteemides (nt Interneti-juurdepääsuga süsteemides).

docref_ext string

Kommenteeri:

Docref_ext väärtus peab algama punktiga "." .

error_prepend_string string

Rida, mis prinditakse vahetult enne veateadet.

Error_append_string string

Rida, mis prinditakse pärast veateadet.

Error_log string

Faili nimi, millele veateated lisatakse. Veebiserveri kasutaja peab faili kirjutamiseks avama. Kui kasutatakse eriväärtust syslog, siis saadetakse sõnumid süsteemilogi. Unixi süsteemides on see syslog(3), Windows NT-s on see sündmuste logi. Windows 95 ei toeta Syslogi. Vaadake ka: syslog(). Kui käsk on määramata, saadetakse vead SAPI logidesse. Näiteks võib see olla Apache'i vealogid või lõim stderr CLI käsurida. Vaata ka funktsiooni

Disainerid veedavad tunde oma tööd lihvides, et hoolikalt viimistleda nende pastakast välja tuleva veebisaidi kujunduse väikseimaid detaile. Koodi kvaliteet jääb aga väga sageli väga madalaks. Kas vajate tõestust? Vaadake tasuta CSS-i mallide galeriid. 90% mallidest ei läbi kontrolli. Pealegi on suurem osa vigadest väga primitiivsed ja neid on väga lihtne parandada. Selles õppetükis vaatleme HTML-koodi tüüpilisi vigu, mis takistavad kinnitamise edukat lõpuleviimist.

Miks kontrollida koodi?

Kui sait näeb brauseris suurepärane välja, siis miks kontrollida koodi? Tüüpiline küsimus, mis küsitakse enne koodi ülevaatamist. Kuid sait ei piirdu ainult sellega, mis on kasutajale nähtav. HTML-lehed on loodud andmete, mitte graafiliste efektide esitamiseks. Andmed peavad olema loetavad kogu Interneti-kasutajate suurele kogukonnale. Ja lugejad saavad teie saidil esitatud teabe saamiseks kasutada väga erinevaid tehnoloogiaid – näiteks saavad nad kasutada häälprogrammi ja lihtsalt kuulata, mis teie lehel on kirjutatud.

Veavaba HTML-leht kuvatakse üldiselt enamikus brauserites õigesti ja ühildub ka tulevaste tehnoloogiatega. Siinkohal tasub mainida otsingumootoreid, mille toimimine on SEO eesmärkidel väga oluline. Keegi ei taha neile takistusi tekitada ning puhast ja õiget koodi on otsingurobotidel palju lihtsam tajuda.

See on ka professionaalsuse küsimus. Vale HTML-kood on väga sarnane veebisaidi tekstis esinevatele grammatikavigadele. Ja kuigi klient ei pruugi koodis vigu märgata, ei muuda see probleemi olemust. Grammatilised vead disainis ei meeldi kellelegi, kuid millegipärast ei peeta HTML-koodi vigadega jätmist sama häbiväärseks teoks.

Levinud vead

Allpool on vead, mis kuulsa CSS-i mallide galerii esimese lehe mallides tabati. Paljud veebisaidid näevad suurepärased välja, isegi suurepärased, kuid sageli ei vasta koodi kvaliteet kujunduse kvaliteedile. Kuigi enamikku neist vigadest saab väga kiiresti ja lihtsalt parandada.


Halvim viga on mitte kasutada Doctype! Silt puudub Doctype tähendab, et brauser "arvab ära", mis keelt dokumendi loomisel kasutati. Vea parandamiseks peate määrama oma lehe dokumenditüübi.

Element pole suletud


Kui avate märgendi kuskil HTML-dokumendis, peate selle sobivas kohas sulgema. Selles küsimuses unustamine ei põhjusta mitte ainult vigu koodi kontrollimisel, vaid võib põhjustada ka malliga tõsiseid probleeme. Joonisel on kujutatud olukord, kus autor unustas sildi sulgeda

Isesulguvates elementides jätab / märgi välja


Enamikul HTML-elementidel on eraldi sulgemissildid, näiteks: