Projektissa piti kirjautua sisään modaalisten ikkunoiden ja "tavallisten" sivujen kautta erityyppisille laitteille. Etsimisen jälkeen tajusin, että se, mitä usein kuvataan, ei ole aivan sitä, mitä tarvitaan. Joten he yksinkertaisesti sijoittavat lomakkeen modaaliseen ikkunaan (todellisuudessa käyttämällä ) ja tässä (kirjautuminen ja rekisteröinti) ohittavat menetelmät suunnitteluohjaimissa niin, että ne palauttavat aina vain jsonin ja "ei-modaalista" toimintaa varten sinun on kirjoitettava monia ehtoja pyyntömuodon tarkistamisessa. Joten päätin kokeilla uutta sovellusta ja kirjoittaa tuen kahdelle muodolle, joissa on vähimmäismäärä ohittavia ja likaisia ​​hakkereita.

Sovelluksen luominen

  1. Luodaan sovellus ilman testejä ja käynnistetään paketin asennus: kiskot new devise_modal -B -T
  2. Lisää tarvittavat helmet Gemfile:

    Ja asenna kaikki: pakettiasennus

  3. Käynnistämme tarvittavat generaattorit
    rails g bootstrap:asenna staattinen , "staattinen", koska tyyleissä ei tarvitse muuttaa mitään bootstrap"ei tehdä niin
    kiskot g devise:install; kiskot g suunnitella Käyttäjä; rake db:migrate - asenna suunnitella ja luo käyttäjä
  4. Luo ohjain, joka näyttää pääsivun:
    kiskot g ohjaimen tervetuloindeksi --no-helper --no-assets
    SISÄÄN config/routes.rb solmio indeksi etusivulle:
    juuri "tervetuloa #index"
Tämän vaiheen lopussa on hakemus, jonka vakiolinkeissä on kirjautumis-/rekisteröitymislomakkeet suunnitella: users/sign_in ja users/sign_up .

Modaaliikkunat lomakkeille

Lomakkeissa ei ole mitään merkittävää - käytämme vakiomuotoisia suunnitella"ovskie on tehnyt ne etä ja muuta muotoa muotoon json. Seuraavaksi teemme niistä modaalisia käärimällä ne sopiviin luokkiin bootstrap"Ah. Lopulta se meni näin osittainen"s:




Lisätään näiden tiedostojen näyttö ja linkit niiden kutsumista varten layout:
<%= link_to "Sign in", "#sign_in", "data-toggle" =>"modal", :class => "btn btn-small" %><%= link_to "Sign up", "#sign_up", "data-toggle" =>"modal", :class => "btn btn-small" %><%= render "shared/sign_in" %> <%= render "shared/sign_up" %>
Ja sen jälkeen parannetaan sitä hieman tarkistamalla käyttäjän läsnäolo:
app/views/layouts/application.html.erb
<% if current_user %> <%= "Hello, #{current_user.email}" %> <%= link_to "Sign out", destroy_user_session_path, :method =>:delete %><% else %> <%= link_to "Sign in", "#sign_in", "data-toggle" =>"modal", :class => "btn btn-small" %><%= link_to "Sign up", "#sign_up", "data-toggle" =>"modal", :class => "btn btn-small" %><%= render "shared/sign_in" %> <%= render "shared/sign_up" %> <% end %>
Jotta tämä toimisi, sinun on lisättävä useita menetelmiä Application_helper, jotka määrittävät resurssi ja vastaavat tähän kontekstiin:
app/helpers/application_helper.rb
def resource_name:user end def resurssi @resurssi ||= User.new end def devise_mapping @devise_mapping ||= Devise.mappings[:user] end
Kuten printercu ja DarthSim huomauttivat kommenteissa, määrittele globaalit auttajat uudelleen resurssi ei ole mitään järkeä, on parempi asettaa se suoraan lomakkeisiin resurssi- User.new , ja sen sijaan resurssin_nimi- :käyttäjä. myös sisällä app/views/shared/_sign_in.html.erb määritetään sen sijaan Devise.mappings[:user] Devise_mapping. Yleensä voit päästä eroon tästä tilasta kokonaan:<% if devise_mapping.rememberable? -%>sen perusteella, määritämmekö mallissa käyttäjän ( app/models/user.rb):muistoinen. Sitä paitsi sisään app/views/shared/_sign_up.html.erb siellä oli myös apulainen devise_error_messages!, joka käyttää resurssi, mutta koska virheteksti on peräisin json"ja vastauksen, poistamme sen lomakkeesta<%= devise_error_messages! %>tarpeettomana.
Nyt on olemassa modaalilomakkeita, jotka ovat käytettävissä miltä tahansa sivulta ja joiden avulla voit kirjautua sisään ja rekisteröityä. Ei jää muuta kuin tehdä suunnitella En lähettänyt html-sivuja vastauksena näihin pyyntöihin.

JSON-vastaukset suunnittelusta

Jalokivissä suunnitella FailureApp vastaa sisäänkirjautumiseen liittyvistä virheistä. Jos sisään tulee virhe SessionsController"e, joka käsittelee sisäänkirjautumispyynnöt, on nimeltään response , jossa http_auth?:lla se tarkistetaan: sinun on lähetettävä 401-tila tai ohjattava toiselle sivulle. Koska oletuksena suunnitella"A:
config/initializers/devise.rb
config.http_authenticatable_on_xhr = true, sitten palautetaan 401.
RegistrationsController lähettää vastauksena AJAX-pyyntöön html-sivun; tämän korjaamiseksi määritellään sitä hieman uudelleen - ilmoitamme nimenomaisesti, mistä muodoista olemme kiinnostuneita:
kiskot g ohjain Rekisteröinnit --no-helper --no-assets --no-views
config/routes.rb
devise_for:users, controllers: (rekisteröinnit: "rekisteröinnit")
app/controllers/registrations_controller.rb
luokan RegistrationsController< Devise::RegistrationsController respond_to:html, :json end
Nyt, jos rekisteröintiyritys epäonnistuu, palautetaan 422-tila ja virhetekstit vastausJSON["virheet"], ja jos onnistuu - 201. Vastaavasti SessionsController"ja onnistuneen sisäänkirjautumisen yhteydessä sinun on annettava tila, ei html-sivua, joten "opetamme" hänelle kuinka reagoida oikein json pyynnöt:
kiskot g ohjain Sessions --no-helper --no-assets --no-views
config/routes.rb
devise_for:users, controllers: (istunnot: "istunnot", rekisteröinnit: "rekisteröinnit")
app/controllers/sessions_controller.rb
luokan SessionsController< Devise::SessionsController respond_to:html, :json end
Voit myös kirjoittaa javascript, joka käsittelee vastaukset modaalisista lomakkeista, kuten tämä:
app/assets/javascripts/welcome.js.coffee
$ -> $("form#sign_in_user, form#sign_up_user").bind("ajax:success", (tapahtuma, xhr, asetukset) -> $(this).parents(.modal").modal("piilota" ")).bind("ajax:error", (tapahtuma, xhr, asetukset, poikkeukset) -> error_messages = if xhr.responseJSON["virhe"] "
" + xhr.responseJSON["virhe"] + "
" else if xhr.responseJSON["virheet"] $.map(xhr.responseJSON["virheet"], (v, k) -> "
" + k + " " + v + "
").liity "" muuhun "
Tuntematon virhe
" $(this).parents(".modal").children(.modal-footer").html(error_messages))
Kun kirjaudut sisään, kääri virhe hälytys, ja rekisteröinnin aikana - virheitä jokaiselle parametrille, jonka jälkeen näytämme vastaanotetun viestin alatunniste"e. Jos pyyntö onnistuu, poistamme vain modaalilomakkeen (voit myös päivittää eston layout"e, jossa käyttäjän läsnäolo tarkistetaan käyttäjätietojen näyttämiseksi (ne tulevat myös vastauksessa)).
Nyt ohjaimet tarjoavat vastaukset oikeassa muodossa, aivan kuten modaalisille muodoille - json, ja tavalliselle ( käyttäjät/sisäänkirjautuminen, käyttäjät/sign_up) - html. Ja tähän tarvittiin vain määrittää ohjaimet uudelleen ja laajentaa formaattien joukkoa:
answer_to:html, :json
Huomautus
Sovellus on kirjoitettu raileilla 4, mutta erot 3.2:ssa ovat minimaaliset: paketin asennus suoritetaan sovellusta luotaessa, sinun on poistettava public/index.html ja polku pääsivulle näyttää hieman erilaiselta:
config/routes.rb
root to: "welcome#index" Jos haluat yksityiskohtaisen kuvauksen PHP_INI_*-vakioista, katso kohta Missä konfigurointiasetuksia voidaan asettaa.

Konfigurointiohjeiden lyhyt kuvaus.

Asettaa virheen kirjaustason. Parametri voi olla joko bittikenttää edustava numero tai nimetty vakio. Vastaavat tasot ja vakiot on annettu Ennalta määritetyt vakiot -osiossa sekä php.ini-tiedostossa. Käytä toimintoa asettaaksesi asetuksen ajon aikana error_reporting(). Katso myös display_errors -direktiivin kuvaus.

PHP 5.3:ssa ja uudemmissa versioissa oletusarvo on E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED. Tällä asetuksella virhetasoja ei näytetä E_NOTICE, E_STRICT Ja E_DEPRECATED. Voit näyttää ne kehityksen aikana. Ennen PHP 5.3.0:ta oletusarvo oli E_ALL & ~E_NOTICE & ~E_STRICT. PHP 4:ssä oletusarvo oli E_ALL & ~E_NOTICE.

Kommentti:

Inkluusio E_NOTICE kehityksen aikana on useita etuja. Vianetsintä: HUOMAUTUS-viestit voivat varoittaa mahdollisista koodin virheistä. Esimerkiksi alustamattomien muuttujien käyttö aiheuttaa samanlaisen viestin. Tämä on erittäin hyödyllistä kirjoitusvirheiden etsimisessä ja säästää aikaa virheenkorjauksessa. HUOMIO-viestit varoittavat myös huonosta tyylistä. Esimerkiksi, $arr On parempi kirjoittaa näin: $arr["tuote"] siitä lähtien, kun PHP aloitti tulkkauksen "tuote" vakiona. Jos se ei ole vakio, PHP ottaa tämän lausekkeen taulukkoelementin merkkijonoindeksiksi.

Kommentti:

PHP 5:ssä on saatavilla uusi virhetaso E_STRICT. Koska E_STRICT ei sisälly E_ALL, sinun on otettava tämä virhetaso erikseen käyttöön. Inkluusio E_STRICT kehityksen aikana on myös etunsa. STRICT-viestit tarjoavat vihjeitä, jotka voivat auttaa varmistamaan koodisi paremman toiminnan ja taaksepäin yhteensopivuuden. Nämä viestit voivat sisältää esimerkiksi ei-staattisten menetelmien kutsumista staattisesti, ominaisuuksien määrittelyä yhteensopivassa luokassa, kun ne on jo määritetty käytettävässä ominaisuudessa, ja ennen PHP 5.3:a jotkin vanhentuneet ominaisuudet aiheuttavat myös tasovirheitä. E_STRICT, kuten objektien määrittäminen viittauksella ilmentymää luotaessa.

Kommentti: PHP-vakiot PHP:n ulkopuolella

PHP-vakioiden käyttäminen PHP:n ulkopuolella, kuten httpd.conf-tiedostossa, ei ole järkevää, koska tällaisissa tapauksissa tarvitaan kokonaislukuarvoja ( kokonaisluku). Lisäksi uusia virhetasoja lisätään ajan myötä ja vakion maksimiarvo E_ALL kasvaa vastaavasti. Siksi paikassa, jossa sinun on ilmoitettava E_ALL, on parempi määrittää suuri kokonaisluku kattamaan kaikki mahdolliset bittikentät. Tämä numero voisi olla esim. 2147483647 (se sisältää kaikki mahdolliset virheet, ei vain E_ALL).

display_errors merkkijono

Tämä asetus määrittää, näytetäänkö virheet muun lähdön kanssa vai piilotetaanko virheet käyttäjältä.

Merkitys "stderr" lähettää virheitä streamiin stderr sijasta stdout. Arvo on saatavilla PHP 5.2.4:ssä. Aiemmissa versioissa tällä direktiivillä oli tyyppi boolean.

Kommentti:

Tämä toiminto on tarkoitettu vain kehityskäyttöön, eikä sitä tule käyttää tuotantojärjestelmissä (esimerkiksi järjestelmissä, joissa on Internet-yhteys).

Kommentti:

Vaikka display_errors voidaan asettaa suorituksen aikana ( ini_set()), tämä ei vaikuta mihinkään, jos skriptissä on vakavia virheitä. Tämä johtuu siitä, että ohjelman odotetut toimet suorituksen aikana eivät saa ohjausta (ei suoriteta).

display_startup_errors boolean

Vaikka display_errors on käytössä, PHP:n käynnistyksen aikana ilmeneviä virheitä ei näytetä. Suosittelemme, että otat display_startup_errors-direktiivin käyttöön vain virheenkorjaustarkoituksiin.

Log_errors boolean

Vastaa lokin valinnasta, johon virheilmoitukset tallennetaan. Tämä voi olla palvelinloki tai error_log. Tämän asetuksen soveltuvuus riippuu tietystä palvelimesta.

log_errors_max_len kokonaisluku

Asettaa log_errorsin enimmäispituuden tavuina. Tiedot lähteestä lisätään error_logiin. Oletusarvo on 1024. Arvon asettaminen 0:ksi poistaa log_errors-virheiden pituuden rajoituksen. Tämä rajoitus koskee kirjattuja virheitä, näytettyjä virheitä ja $php_errormsg .

Jos käytetään kokonaisluku, arvo mitataan tavuina. Voit myös käyttää lyhennettyä merkintää, joka on kuvattu tässä FAQ:ssa. ignore_repeated_errors boolean

Älä kirjaa toistuvia virheitä. Virhe katsotaan toistuvaksi virheeksi, jos se tapahtuu samassa tiedostossa ja samalla rivillä ja jos asetus on poistettu käytöstä.

Ohita_toistuva_lähde boolean

Ohita virheiden lähde ohittaessasi päällekkäisiä viestejä. Kun tämä asetus on käytössä, päällekkäisiä virheilmoituksia ei kirjata lokiin riippumatta siitä, missä tiedostoissa tai riveissä ne esiintyvät.

Report_memleaks boolean

Jos asetus on käytössä (oletus), Zend-muistinhallinnan havaitsemista muistivuodoista luodaan raportti. POSIX-alustoilla tämä raportti lähetetään stderr:lle. Windows-ympäristöissä se lähetetään virheenkorjaajalle OutputDebugString()-funktiolla; tässä tapauksessa voit tarkastella raporttia apuohjelmilla, kuten "DbgView". Tämä asetus on järkevä virheenkorjaukseen tarkoitetuissa versioissa. Jossa E_VAROITUS on sisällytettävä error_reporting -luetteloon.

Track_errors boolean

Jos tämä on käytössä, viimeisin tapahtunut virhe on ensimmäinen muuttujassa $php_errormsg.

Html_errors boolean

Poistaa käytöstä HTML-tunnisteet virheilmoituksissa. Uusi HTML-virheviestimuoto mahdollistaa linkkien lisäämisen viesteihin ja käyttäjän uudelleenohjauksen virhesivuille. Docref_root ja docref_ext ovat vastuussa tällaisista linkeistä.

Xmlrpc_errors boolean

Vaihtaa virheviestien muotoilun XML-RPC-viestimuotoon.

Xmlrpc_error_number kokonaisluku

Käytetään XML-RPC faultCode -elementin arvona.

Docref_root merkkijono

Uusi virhemuoto sisältää linkin sivulle, joka kuvaa virheen tai virheen aiheuttaneen ominaisuuden. Voit sijoittaa kopion virhe- ja ominaisuuskuvauksista paikallisesti ja asettaa ini-direktiivin kyseisen kopion URL-osoitteeseen. Jos esimerkiksi paikallinen kopio kuvauksista on saatavilla osoitteessa "/manuaali/", Kirjoita docref_root=/manual/. Lisäksi sinun on asetettava arvo docref_ext-direktiiville, joka vastaa tiedostopäätteiden sovittamisesta paikallisen kopiosi kuvaustiedostoihin, docref_ext=.html. On myös mahdollista käyttää ulkoisia linkkejä. Esimerkiksi, docref_root=http://manual/en/ tai docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon &url=http%3A%2F%2Fwww.php.net%2F"

Useimmissa tapauksissa haluat, että docref_root-arvo päättyy vinoon "/" . Joskus tätä ei kuitenkaan vaadita (katso toinen esimerkki yllä).

Kommentti:

Tämä toiminto on tarkoitettu vain kehityskäyttöön, koska se helpottaa ominaisuuskuvausten ja virheiden löytämistä. Älä käytä sitä valmiissa tuotantojärjestelmissä (kuten niissä, joissa on Internet-yhteys).

docref_ext merkkijono

Kommentti:

Docref_ext-arvon tulee alkaa pisteellä "." .

error_prepend_string merkkijono

Rivi, joka tulostetaan välittömästi ennen virheilmoitusta.

Error_append_string merkkijono

Rivi, joka tulostetaan virheilmoituksen jälkeen.

Error_log merkkijono

Sen tiedoston nimi, johon virheilmoitukset lisätään. Web-palvelimen käyttäjän on avattava tiedosto kirjoittamista varten. Jos käytetään erityistä arvoa syslog, viestit lähetetään järjestelmälokiin. Unix-järjestelmissä tämä on syslog(3), Windows NT:ssä tapahtumaloki. Syslogia ei tueta Windows 95:ssä. Katso myös: syslog(). Jos ohjetta ei ole asetettu, virheet lähetetään SAPI-lokeihin. Tämä voi olla esimerkiksi Apache-virheloke tai säiettä stderr CLI-komentorivi. Katso myös toiminto

Suunnittelijat viettävät tuntikausia käsityönsä hiomiseen hienosäätääkseen huolellisesti heidän kynstään tulevia verkkosivustojen suunnittelun pienimpiä yksityiskohtia. Koodin laatu on kuitenkin usein hyvin heikkoa. Tarvitsetko todisteita? Tutustu ilmaisten CSS-mallien gallerioihin. 90 % malleista ei läpäise vahvistusta. Lisäksi suurin osa virheistä on hyvin alkeellisia ja erittäin helppo korjata. Tällä oppitunnilla tarkastelemme tyypillisiä HTML-koodin virheitä, jotka estävät vahvistuksen suorittamisen loppuun.

Miksi tarkistaa koodi?

Jos sivusto näyttää hyvältä selaimessa, miksi tarkistaa koodi? Tyypillinen kysymys ennen koodin tarkistamista. Mutta sivusto ei rajoitu vain siihen, mikä näkyy käyttäjälle. HTML-sivut on suunniteltu esittämään tietoja, ei graafisia tehosteita. Tietojen on oltava koko suuren Internetiä käyttävän yhteisön luettavissa. Ja lukijat voivat käyttää hyvin erilaisia ​​tekniikoita vastaanottaakseen sivustollasi esitettyä tietoa - he voivat esimerkiksi käyttää puheohjelmaa ja yksinkertaisesti kuunnella, mitä sivullasi on kirjoitettu.

Virheetön HTML-sivu näkyy yleensä oikein useimmissa selaimissa ja on myös yhteensopiva tulevien teknologioiden kanssa. Tässä on syytä mainita hakukoneet, joiden toiminta on erittäin tärkeää SEO-tarkoituksiin. Kukaan ei halua luoda heille esteitä, ja puhdas ja oikea koodi on paljon helpompi havaita hakubottien avulla.

Kyse on myös ammattitaidosta. Väärä HTML-koodi on hyvin samanlainen kuin verkkosivuston tekstin kielioppivirheet. Ja vaikka asiakas ei ehkä huomaa virheitä koodissa, tämä ei muuta ongelman ydintä. Kukaan ei pidä kielioppivirheistä suunnittelussa, mutta jotenkin virheellisen HTML-koodin jättämistä ei pidetä samana häpeällisenä tekona.

Yleisiä virheitä

Alla on virheet, jotka löydettiin kuuluisan CSS-malligallerian ensimmäiseltä sivulta oleviin malleihin. Monet verkkosivustot näyttävät upeilta, jopa upeilta, mutta usein koodin laatu ei vastaa suunnittelun laatua. Vaikka useimmat näistä virheistä voidaan korjata erittäin nopeasti ja helposti.


Pahin virhe on olla käyttämättä Doctype! Ei tagia Doctype tarkoittaa, että selain "arvaa" mitä kieltä asiakirjan luomiseen käytettiin. Virheen korjaamiseksi sinun on määritettävä sivusi asiakirjatyyppi.

Elementti ei ole suljettu


Jos avaat tunnisteen jossain HTML-dokumentissasi, sinun on suljettava se oikeaan paikkaan. Unohtaminen tässä asiassa ei johda vain virheisiin koodia tarkistettaessa, vaan voi myös aiheuttaa vakavia ongelmia mallin kanssa. Kuvassa on tilanne, jossa kirjoittaja unohti sulkea tagin

Jättää pois /-merkin itsestään sulkeutuvista elementeistä


Useimmilla HTML-elementeillä on erilliset sulkevat tagit, esimerkiksi: