Projektā bija jāpiesakās caur modālajiem logiem un “parastajām” lapām dažāda veida ierīcēm. Pēc meklējumiem sapratu, ka bieži aprakstītais nav gluži tas, kas vajadzīgs. Tāpēc viņi vienkārši ievieto veidlapu modālā logā (faktiski izmantojot ), un šeit (pieteikšanās un reģistrācija) viņi ignorē metodes izstrādes kontrolleros, lai tie vienmēr atgrieztu tikai json un “ne-modālai” darbībai jums būs jāraksta. daudz nosacījumu, pārbaudot pieprasījuma formātu. Tāpēc es nolēmu eksperimentēt ar jaunu lietojumprogrammu un rakstīt atbalstu 2 formātiem ar minimālu pārākumu un netīro uzlaušanu.

Aplikācijas izveide

  1. Ģenerēsim lietojumprogrammu bez testiem un palaidīsim komplekta instalēšana: sliedes new devise_modal -B -T
  2. Pievienojiet nepieciešamos dārgakmeņus Gemfile:

    Un instalējiet visu: instalējiet komplektā

  3. Mēs iedarbinām nepieciešamos ģeneratorus
    sliedes g bootstrap: instalēt static , "static", jo stilos nekas nav jāmaina bootstrap"neļausim
    sliedes g izdomāt:instalēt; sliedes g izstrādāt Lietotājs; rake db:migrate - instalēt izdomāt un izveidot lietotāju
  4. Izveidojiet kontrolieri, kas parādīs galveno lapu:
    sliedes g kontrollera sveiciena indekss --no-helper --no-assets
    IN config/routes.rb kakla saite rādītājs uz galveno lapu:
    sakne "welcome#index"
Šī posma beigās ir pieteikums ar pieteikšanās/reģistrācijas veidlapām uz standarta saitēm izdomāt: users/sign_in un users/sign_up .

Modālie logi formām

Veidlapās nav nekā ievērības cienīga – izmantojam standarta izdomāt"ovskie tos izgatavoja tālvadības pults un mainot formātu uz json. Tālāk mēs padarām tos modālus, iesaiņojot tos atbilstošās klasēs bootstrap"Ah. Beigās sanāca šādi daļēja"s:




Pievienosim šo failu displeju un saites, lai tos izsauktu izkārtojumu:
<%= 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" %>
Un pēc tam to nedaudz uzlabosim, pārbaudot lietotāja klātbūtni:
app/views/layouts/application.html.erb
<% if current_user %> <%= "Hello, #{current_user.email}" %> <%= link_to "Sign out", destroy_user_session_path, :method =>:dzēst %><% 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 %>
Lai tas darbotos, jums jāpievieno vairākas metodes Application_helper, kas nosaka resursu un saistīti ar šo kontekstu:
app/helpers/application_helper.rb
def resursa_nosaukums:lietotāja beigas def resurss @resurss ||= User.new beigu def devise_mapping @devise_mapping ||= Devise.mappings[:user] end
Kā komentāros atzīmēja printercu un DarthSim, atkārtoti definējiet globālos palīgus resursu maz jēgas, labāk to tieši iestatīt formās resursu- User.new , un tā vietā resursa_nosaukums- :lietotājs. arī iekšā app/views/shared/_sign_in.html.erb tā vietā norādīsim Devise.mappings[:user] izstrādāt_kartēšana. Kopumā jūs varat pilnībā atbrīvoties no šī stāvokļa:<% if devise_mapping.rememberable? -%>pamatojoties uz to, vai modelī mēs norādām lietotāju ( app/models/user.rb): atceras. Turklāt iekšā app/views/shared/_sign_up.html.erb bija arī palīgs devise_error_messages!, kas izmanto resursu, bet tā kā kļūdas teksts ir ņemts no json"un atbildi, tad mēs to vienkārši izdzēsīsim no veidlapas<%= devise_error_messages! %>kā nevajadzīgs.
Tagad ir modālas veidlapas, kas ir pieejamas no jebkuras lapas un ļauj pieteikties un reģistrēties. Atliek tikai darīt izdomāt Es nesūtīju html lapas, atbildot uz šiem pieprasījumiem.

JSON atbildes no ierīces

Dārgakmens izdomāt FailureApp ir atbildīgs par pieteikšanās kļūdām. Ja rodas kļūda SessionsController"e, kas apstrādā pieteikšanās pieprasījumus, sauc atbildes , kur, izmantojot http_auth?, ir atzīmēts: jums jānosūta 401 statuss vai jāpāradresē uz citu lapu. Tā kā pēc noklusējuma izdomāt"A:
config/initializers/devise.rb
config.http_authenticatable_on_xhr = true, tad tiek atgriezts 401.
RegistrationsController, atbildot uz AJAX pieprasījumu, nosūta html lapu; lai to labotu, definēsim to nedaudz no jauna — mēs skaidri norādīsim, kuri formāti mūs interesē:
sliedes g kontrolleris Reģistrācijas --no-helper --no-assets --no-views
config/routes.rb
devise_for:users, controllers: (reģistrācijas: "reģistrācijas")
app/controllers/registrations_controller.rb
klase RegistrationsController< Devise::RegistrationsController respond_to:html, :json end
Tagad, ja reģistrācijas mēģinājums neizdodas, tiks atgriezts 422 statuss ar kļūdu tekstiem atbildeJSON["kļūdas"], un veiksmes gadījumā - 201. Tāpat par SessionsController"un pēc veiksmīgas pieteikšanās jums ir jānorāda statuss, nevis html lapa, tāpēc mēs viņam "pamācīsim", kā pareizi reaģēt uz json pieprasījumi:
sliedes g kontrolleris Sesijas --no-helper --no-assets --no-views
config/routes.rb
devise_for:users, controllers: (sesijas: "sesijas", reģistrācijas: "reģistrācijas")
app/controllers/sessions_controller.rb
klases SessionsController< Devise::SessionsController respond_to:html, :json end
Var arī rakstīt javascript, kas apstrādās atbildes no modālajām formām, piemēram:
app/assets/javascripts/welcome.js.coffee
$ -> $("form#sign_in_user, form#sign_up_user").bind("ajax:success", (notikums, xhr, iestatījumi) -> $(this).parents(.modal").modal("hide ")).bind("ajax:error", (notikums, xhr, iestatījumi, izņēmumi) -> error_messages = if xhr.responseJSON["kļūda"] "
" + xhr.responseJSON["kļūda"] + "
" else if xhr.responseJSON["kļūdas"] $.map(xhr.responseJSON["kļūdas"], (v, k) -> "
" + k + " " + v + "
"). pievienoties "" cits "
Nezināma kļūda
" $(this).parents(.modal").children(.modal-footer").html(error_messages))
Piesakoties, ievadiet kļūdu brīdinājums, un reģistrācijas laikā - kļūdas katram parametram, pēc kura mēs parādām saņemto ziņojumu kājene"e. Ja pieprasījums ir veiksmīgs, mēs vienkārši noņemam modālo veidlapu (varat arī atjaunināt bloku izkārtojumu"e, kurā tiek pārbaudīta lietotāja klātbūtne, lai parādītu lietotāja datus (tie nāk arī atbildē)).
Tagad kontrolieri sniedz atbildes pareizajā formātā, tāpat kā modālajām formām - json, un standarta ( lietotāji/pierakstīšanās, lietotāji/reģistrēšanās) - html. Un viss, kas tam bija nepieciešams, bija no jauna definēt kontrolierus, paplašinot formātu kopu:
answer_to:html, :json
Piezīme
Lietojumprogramma tika uzrakstīta rails 4, taču atšķirības 3.2 būs minimālas: veidojot lietojumprogrammu, tiks veikta komplekta instalēšana, jums būs jāizdzēš public/index.html, un ceļš uz galveno lapu izskatīsies nedaudz savādāk:
config/routes.rb
root to: "welcome#index" Lai iegūtu detalizētu PHP_INI_* konstantu aprakstu, skatiet sadaļu Kur var iestatīt konfigurācijas opcijas.

Īss konfigurācijas direktīvu skaidrojums.

Iestata kļūdu reģistrēšanas līmeni. Parametrs var būt skaitlis, kas apzīmē bitu lauku, vai nosaukta konstante. Atbilstošie līmeņi un konstantes ir norādītas sadaļā Iepriekš definētās konstantes, kā arī php.ini. Lai iestatītu iestatījumu izpildes laikā, izmantojiet funkciju error_reporting(). Skatiet arī direktīvas display_errors aprakstu.

PHP 5.3 un jaunākā versijā noklusējuma vērtība ir E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED. Izmantojot šo iestatījumu, kļūdu līmeņi netiek parādīti E_NOTICE, E_STRICT Un E_DEPRECATED. Jūs varat tos parādīt izstrādes laikā. Pirms PHP 5.3.0 noklusējuma vērtība bija E_ALL & ~E_NOTICE & ~E_STRICT. PHP 4 noklusējuma vērtība bija E_ALL & ~E_NOTICE.

komentēt:

Iekļaušana E_NOTICE izstrādes laikā ir vairākas priekšrocības. Atkļūdošanai: NOTICE ziņojumi var brīdināt par iespējamām kļūdām kodā. Piemēram, izmantojot neinicializētus mainīgos, tiks parādīts līdzīgs ziņojums. Tas ir ļoti noderīgi, atrodot drukas kļūdas, un ietaupa laiku, veicot atkļūdošanu. NOTICE ziņojumi arī brīdina par sliktu stilu. Piemēram, $arr Labāk ir rakstīt šādi: $arr["prece"] kopš PHP sāka tulkot "lieta" kā konstante. Ja tā nav konstante, PHP izmanto šo izteiksmi kā masīva elementa virknes indeksu.

komentēt:

PHP 5 ir pieejams jauns kļūdu līmenis E_STRICT. Jo E_STRICT nav iekļauts E_ALL, jums ir skaidri jāiespējo šis kļūdas līmenis. Iekļaušana E_STRICT attīstības laikā ir arī savas priekšrocības. STRICT ziņojumi piedāvā padomus, kas var palīdzēt nodrošināt labāku koda funkcionalitāti un atpakaļejošu saderību. Šie ziņojumi var ietvert tādas lietas kā nestatisku metožu statiska izsaukšana, rekvizītu definēšana saderīgā klasē, ja tie jau ir definēti izmantotajā pazīmē, un pirms PHP 5.3 daži novecojuši līdzekļi arī radīs līmeņa kļūdas. E_STRICT, piemēram, objektu piešķiršana pēc atsauces, veidojot gadījumu.

komentēt: PHP konstantes ārpus PHP

Nav jēgas izmantot PHP konstantes ārpus PHP, piemēram, failā httpd.conf, jo šādos gadījumos ir nepieciešamas veselas vērtības ( vesels skaitlis). Turklāt laika gaitā tiks pievienoti jauni kļūdu līmeņi un konstantes maksimālā vērtība E_ALL attiecīgi pieaugs. Tāpēc vietā, kur jums vajadzētu norādīt E_ALL, labāk ir norādīt lielu veselu skaitli, lai aptvertu visus iespējamos bitu laukus. Šis skaitlis varētu būt, piemēram, 2147483647 (tas ietvers visas iespējamās kļūdas, ne tikai E_ALL).

displeja_kļūdas virkne

Šis iestatījums nosaka, vai kļūdas ir jāparāda kopā ar pārējo izvadi, vai arī kļūdas ir jāslēpj no lietotāja.

Nozīme "stderr" nosūta straumei kļūdas stderr tā vietā stdout. Vērtība ir pieejama PHP 5.2.4. Iepriekšējās versijās šai direktīvai bija šāds tips Būla.

komentēt:

Šī funkcionalitāte ir paredzēta tikai izstrādei, un to nedrīkst izmantot ražošanas sistēmās (piemēram, sistēmās ar piekļuvi internetam).

komentēt:

Lai gan display_errors var iestatīt izpildlaikā (ar ini_set()), tas neko neietekmēs, ja skriptā ir fatālas kļūdas. Tas ir saistīts ar to, ka programmas sagaidāmās darbības izpildes laikā nesaņems kontroli (netiks izpildītas).

display_startup_errors Būla

Pat ja ir iespējots display_errors, kļūdas, kas rodas PHP startēšanas laikā, netiks parādītas. Mēs ļoti iesakām iespējot direktīvu display_startup_errors tikai atkļūdošanas nolūkos.

Log_errors Būla

Atbildīgs par žurnāla atlasi, kurā tiks saglabāti kļūdu ziņojumi. Tas varētu būt servera žurnāls vai error_log. Šī iestatījuma pielietojamība ir atkarīga no konkrētā servera.

log_errors_max_len vesels skaitlis

Iestata maksimālo log_errors garumu baitos. Informācija par avotu tiek pievienota error_log. Noklusējuma vērtība ir 1024. Iestatot vērtību uz 0, tiek noņemts log_errors garuma ierobežojums. Šis ierobežojums attiecas uz reģistrētajām kļūdām, parādītajām kļūdām un $php_errormsg.

Ja lieto vesels skaitlis, vērtība tiek mērīta baitos. Varat arī izmantot īso apzīmējumu, kas aprakstīts šajā FAQ. ignore_repeated_errors Būla

Nereģistrējiet atkārtotas kļūdas. Kļūda tiek uzskatīta par atkārtotu kļūdu, ja tā rodas tajā pašā failā un tajā pašā rindā un ja iestatījums ir atspējots.

Ignorēt_atkārtots_avots Būla

Ignorējiet kļūdu avotu, izlaižot ziņojumu dublikātus. Ja šis iestatījums ir iespējots, kļūdu ziņojumu dublikāti netiks reģistrēti neatkarīgi no tā, kuros failos vai rindās tie parādās.

Report_memleaks Būla

Ja iestatījums ir iespējots (noklusējums), tiks ģenerēts ziņojums par atmiņas noplūdēm, ko atklāj Zend atmiņas pārvaldnieks. POSIX platformās šis pārskats tiks nosūtīts uz stderr. Windows platformās tas tiks nosūtīts atkļūdotājam, izmantojot funkciju OutputDebugString(); šajā gadījumā varat skatīt pārskatu, izmantojot tādas utilītas kā "DbgView". Šim iestatījumam ir jēga būvējumos, kas paredzēti atkļūdošanai. Kurā E_BRĪDINĀJUMS jāiekļauj kļūdu_ziņošanas sarakstā.

Track_errors Būla

Ja tas ir iespējots, pēdējā kļūda, kas radusies, būs pirmā mainīgajā $php_errormsg.

Html_errors Būla

Atspējo HTML tagus kļūdu ziņojumos. Jaunais HTML kļūdu ziņojumu formāts nodrošina iespēju ziņojumos ievietot saites un novirzīt lietotāju uz kļūdu lapām. Docref_root un docref_ext ir atbildīgi par šādām saitēm.

Xmlrpc_errors Būla

Pārslēdz kļūdu ziņojumu formatējumu uz XML-RPC ziņojuma formātu.

Xmlrpc_error_number vesels skaitlis

Izmanto kā XML-RPC faultCode elementa vērtību.

Docref_root virkne

Jaunajā kļūdas formātā ir saite uz lapu, kurā aprakstīta kļūda vai līdzeklis, kas izraisīja kļūdu. Varat ievietot kļūdas un līdzekļu aprakstu kopiju lokāli un iestatīt ini direktīvu uz šīs kopijas URL. Ja, piemēram, vietējā aprakstu kopija ir pieejama vietnē "/manual/", vienkārši rakstiet docref_root=/manual/. Turklāt jums ir jāiestata docref_ext direktīvas vērtība, kas ir atbildīga par failu paplašinājumu saskaņošanu ar vietējās kopijas apraksta failiem, docref_ext=.html. Ir iespējams izmantot arī ārējās saites. Piemēram, docref_root=http://manual/en/ vai docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon &url=http%3A%2F%2Fwww.php.net%2F"

Vairumā gadījumu jūs vēlaties, lai docref_root vērtība beidzas ar slīpsvītru "/" . Tomēr ir gadījumi, kad tas nav nepieciešams (skatiet otro piemēru iepriekš).

komentēt:

Šī funkcionalitāte ir paredzēta tikai izstrādei, jo tā atvieglo funkciju aprakstu un kļūdu atrašanu. Neizmantojiet to gatavās ražošanas sistēmās (piemēram, ar piekļuvi internetam).

docref_ext virkne

komentēt:

Docref_ext vērtībai jāsākas ar punktu "." .

error_prepend_string virkne

Rinda, kas tiks izdrukāta tieši pirms kļūdas ziņojuma.

Error_append_string virkne

Rinda, kas tiks izdrukāta pēc kļūdas ziņojuma.

Error_log virkne

Faila nosaukums, kuram tiks pievienoti kļūdu ziņojumi. Fails ir jāatver rakstīšanai tīmekļa servera lietotājam. Ja tiek izmantota īpaša vērtība syslog, tad ziņojumi tiks nosūtīti uz sistēmas žurnālu. Unix sistēmās tas ir syslog(3), operētājsistēmā Windows NT tas ir notikumu žurnāls. Syslog netiek atbalstīts operētājsistēmā Windows 95. Skatiet arī: syslog(). Ja direktīva nav iestatīta, kļūdas tiks nosūtītas uz SAPI žurnāliem. Piemēram, tas varētu būt Apache kļūdu žurnāli vai pavediens stderr CLI komandrinda. Skatīt arī funkciju

Dizaineri pavada stundas, pilnveidojot savu amatu, lai rūpīgi noregulētu mazākās vietņu dizaina detaļas, kas nāk no viņu pildspalvām. Tomēr koda kvalitāte ļoti bieži paliek ļoti zema. Vai jums ir nepieciešams pierādījums? Apskatiet bezmaksas CSS veidņu galerijas. 90% veidņu neizturēs verifikāciju. Turklāt lielākā daļa kļūdu ir ļoti primitīvas un ļoti viegli labojamas. Šajā nodarbībā mēs apskatīsim tipiskās kļūdas HTML kodā, kas neļauj veiksmīgi pabeigt verifikāciju.

Kāpēc pārbaudīt kodu?

Ja vietne pārlūkprogrammā izskatās lieliski, kāpēc pārbaudīt kodu? Tipisks jautājums, kas tiek uzdots pirms koda pārskatīšanas. Bet vietne neaprobežojas tikai ar to, kas ir redzams lietotājam. HTML lapas ir izstrādātas, lai parādītu datus, nevis grafiskus efektus. Datiem ir jābūt lasāmiem visai plašajai cilvēku kopienai, kas izmanto internetu. Un lasītāji var izmantot ļoti dažādas tehnoloģijas, lai saņemtu jūsu vietnē sniegto informāciju – piemēram, viņi var izmantot balss programmu un vienkārši klausīties, kas rakstīts jūsu lapā.

HTML lapa, kurā nav kļūdu, parasti tiks pareizi parādīta lielākajā daļā pārlūkprogrammu, un tā būs arī saderīga ar nākotnes tehnoloģijām. Šeit ir vērts pieminēt meklētājprogrammas, kuru darbība ir ļoti svarīga SEO nolūkos. Neviens nevēlas viņiem radīt šķēršļus, un tīru un pareizu kodu ir daudz vieglāk uztvert meklēšanas roboti.

Tas ir arī profesionalitātes jautājums. Nepareizs HTML kods ir ļoti līdzīgs gramatikas kļūdām vietnes tekstā. Un, lai gan klients var nepamanīt kļūdas kodā, tas nemaina problēmas būtību. Nevienam nepatīk gramatikas kļūdas dizainā, taču HTML koda atstāšana ar kļūdām netiek uzskatīta par tādu pašu apkaunojošu darbību.

Biežas kļūdas

Tālāk ir norādītas kļūdas, kas tika konstatētas veidnēs no slavenās CSS veidņu galerijas pirmās lapas. Daudzas vietnes izskatās lieliski, pat lieliski, taču bieži vien koda kvalitāte neatbilst dizaina kvalitātei. Lai gan lielāko daļu šo kļūdu var novērst ļoti ātri un vienkārši.


Sliktākā kļūda ir neizmantot Doctype! Nav atzīmes Doctype nozīmē, ka pārlūkprogramma "uzminēs", kāda valoda tika izmantota dokumenta izveidošanai. Lai labotu kļūdu, jānorāda savas lapas dokumenta veids.

Elements nav aizvērts


Ja kaut kur HTML dokumentā atverat tagu, tas ir jāaizver atbilstošā vietā. Aizmāršība šajā jautājumā ne tikai izraisa kļūdas, pārbaudot kodu, bet arī var radīt nopietnas problēmas ar veidni. Attēlā parādīta situācija, kad autors aizmirsa aizvērt tagu

Pašaizvēršanās elementos tiek izlaista rakstzīme /


Lielākajai daļai HTML elementu ir atsevišķi noslēguma tagi, piemēram: