Projede farklı cihaz türleri için kalıcı pencereler ve “normal” sayfalar üzerinden giriş yapılması gerekiyordu. Araştırdıktan sonra, sıklıkla anlatılanların tam olarak ihtiyaç duyulan şey olmadığını fark ettim. Böylece formu kalıcı bir pencereye yerleştiriyorlar (aslında ) kullanıyorlar ve burada (oturum açma ve kayıt), cihaz denetleyicilerindeki yöntemleri geçersiz kılıyorlar, böylece her zaman yalnızca json döndürüyorlar ve "modal olmayan" davranış için şunu yazmanız gerekecek: istek formatının kontrol edilmesiyle ilgili birçok koşul. Bu yüzden yeni bir uygulamayı denemeye ve minimum miktarda geçersiz kılma ve kirli hack ile 2 format için destek yazmaya karar verdim.

Uygulama oluşturma

  1. Testler olmadan bir uygulama oluşturalım ve başlatalım paket yükleme: raylar yeni devise_modal -B -T
  2. Gerekli taşları ekleyin Gem dosyası:

    Ve her şeyi yükleyin: paket kurulumu

  3. Gerekli jeneratörleri başlatıyoruz
    Rails g bootstrap: stillerde hiçbir şeyin değiştirilmesi gerekmediği için static, "static" yükleyin önyükleme"yapmayalım
    raylar g tasarlama:kurma; Rails g devise Kullanıcısı; rake db:migrate - yükleme tasarlamak ve bir kullanıcı oluşturun
  4. Ana sayfayı görüntüleyecek bir denetleyici oluşturun:
    Rails g denetleyici hoş geldiniz dizini --no-helper --no-assets
    İÇİNDE config/routes.rb bağlamak dizin ana sayfaya:
    kök "hoş geldiniz#dizin"
Bu aşamanın sonunda standart linklerdeki giriş/kayıt formlarının yer aldığı bir başvuru bulunmaktadır. tasarlamak: kullanıcılar/oturum açma_ve kullanıcılar/oturum açma .

Formlar için kalıcı pencereler

Formlarda dikkat çekici hiçbir şey yok - standart olanları kullanıyoruz tasarlamak"ovskie onları yaptı uzak ve formatı şu şekilde değiştiriyorum: json. Daha sonra onları uygun sınıflara sararak kalıcı hale getiriyoruz. önyükleme"ah. Sonunda böyle çıktı kısmi"S:




Bunları çağırmak için bu dosyaların ve bağlantıların bir görüntüsünü ekleyelim düzen:
<%= 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" %>
Daha sonra bir kullanıcının varlığını kontrol ederek durumu biraz iyileştirelim:
app/views/layouts/application.html.erb
<% if current_user %> <%= "Hello, #{current_user.email}" %> <%= link_to "Sign out", destroy_user_session_path, :method =>:% sil><% 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 %>
Bunun çalışması için birkaç yöntem eklemeniz gerekir. application_helper belirleyen kaynak ve bu bağlamda ilgili olanlar:
app/helpers/application_helper.rb
def kaynak_adı:kullanıcı sonu def kaynak @resource ||= User.new end def devise_mapping @devise_mapping ||= Devise.mappings[:user] end
Printercu ve DarthSim'in yorumlarda belirttiği gibi, küresel yardımcıları yeniden tanımlayın. kaynak pek mantıklı değil, bunun yerine doğrudan formlara ayarlamak daha iyidir kaynak- User.new ve bunun yerine kaynak_adı- :kullanıcı. Ayrıca app/views/shared/_sign_in.html.erb bunun yerine Devise.mappings[:user]'i belirtelim devise_mapping. Genel olarak bu durumdan tamamen kurtulabilirsiniz:<% if devise_mapping.rememberable? -%>modelde bir kullanıcı belirleyip belirtmememize bağlı olarak( app/models/user.rb):hatırlanabilir. Ayrıca, app/views/shared/_sign_up.html.erb bir de yardımcı vardı devise_error_messages!, kullanan kaynak, ancak hata metni şuradan alındığından json"ve yanıtını alırsak onu formdan sileceğiz<%= devise_error_messages! %>gereksiz gibi.
Artık herhangi bir sayfadan erişilebilen, giriş yapmanıza ve kaydolmanıza olanak tanıyan kalıcı formlar var. Geriye kalan tek şey tasarlamak Bu isteklere yanıt olarak html sayfaları göndermedim.

cihazdan JSON yanıtları

Mücevherde tasarlamak Oturum açmayla ilgili hatalardan FailureApp sorumludur. Bir hata oluşursa SessionsController"e, oturum açma isteklerini işleyen yanıt olarak adlandırılır, http_auth kullanılarak kontrol edilir: 401 durumu göndermeniz veya başka bir sayfaya yönlendirmeniz gerekir. Varsayılan olarak beri tasarlamak"A:
config/başlatıcılar/devise.rb
config.http_authenticatable_on_xhr = doğruysa 401 döndürülür.
RegistersController, bir AJAX isteğine yanıt olarak bir html sayfası gönderir; bunu düzeltmek için onu biraz yeniden tanımlayalım - hangi formatlarla ilgilendiğimizi açıkça belirteceğiz:
Rails g denetleyici Kayıtlar --yardımcı yok --varlıklar yok --görünüm yok
config/routes.rb
devise_for:kullanıcılar, denetleyiciler: (kayıtlar: "kayıtlar")
app/controllers/registrations_controller.rb
sınıf Kayıt Kontrolörü< Devise::RegistrationsController respond_to:html, :json end
Artık bir kayıt girişimi başarısız olursa, hata metinleriyle birlikte bir 422 durumu döndürülecektir. yanıtJSON["hatalar"], ve eğer başarılıysa - 201. Benzer şekilde SessionsController"ve başarılı bir giriş yaptıktan sonra html sayfasını değil durumu vermeniz gerekir, böylece ona nasıl doğru tepki vereceğini "öğreteceğiz" json istekler:
Rails g denetleyicisi Oturumlar --yardımcı yok --varlıklar yok --görünüm yok
config/routes.rb
devise_for:kullanıcılar, denetleyiciler: (oturumlar: "oturumlar", kayıtlar: "kayıtlar")
app/controllers/sessions_controller.rb
sınıf SessionsController< Devise::SessionsController respond_to:html, :json end
Ayrıca yazabilirsiniz javascript kalıcı formlardan gelen yanıtları şu şekilde işleyecek:
app/assets/javascripts/welcome.js.coffee
$ -> $("form#sign_in_user, form#sign_up_user").bind("ajax:success", (event, xhr, settings) -> $(this).parents(".modal").modal("hide ")).bind("ajax:error", (olay, xhr, ayarlar, istisnalar) -> error_messages = if xhr.responseJSON["hata"] "
" + xhr.responseJSON["hata"] + "
" else if xhr.responseJSON["hatalar"] $.map(xhr.responseJSON["hatalar"], (v, k) -> "
" + k + " " + v + "
").Join "" else "
Bilinmeyen hata
" $(this).parents(".modal").children(".modal-footer").html(error_messages))
Giriş yaparken hatayı sarın uyarı ve kayıt sırasında - her parametre için hatalar, ardından alınan mesajı görüntülüyoruz altbilgi"e. Eğer istek başarılı olursa kalıcı formu kaldırırız (ayrıca bloğu güncelleyebilirsiniz) düzen"e, kullanıcı verilerini görüntülemek için kullanıcının varlığının kontrol edildiği (bunlar yanıtta da gelir)).
Artık denetleyiciler yanıtları tıpkı modal formlarda olduğu gibi doğru biçimde sağlıyor - json ve standart için ( kullanıcılar/sign_in, kullanıcılar/sign_up) - HTML. Bunun için gereken tek şey, format kümesini genişleterek denetleyicileri yeniden tanımlamaktı:
yanıt_to:html, :json
Not
Uygulama Rails 4'te yazılmıştır, ancak 3.2 için farklar minimum düzeyde olacaktır: uygulama oluşturulurken paket kurulumu çalışacaktır, public/index.html'yi silmeniz gerekecektir ve ana sayfanın yolu biraz farklı görünecektir:
config/routes.rb
root to: "welcome#index" PHP_INI_* sabitlerinin ayrıntılı açıklaması için Yapılandırma seçeneklerinin ayarlanabileceği bölüme bakın.

Yapılandırma direktiflerinin kısa bir açıklaması.

Hata günlüğü düzeyini ayarlar. Parametre, bir bit alanını temsil eden bir sayı veya adlandırılmış bir sabit olabilir. Karşılık gelen seviyeler ve sabitler, php.ini'de olduğu gibi, Önceden Tanımlanmış Sabitler bölümünde de verilmiştir. Ayarı çalışma zamanında ayarlamak için işlevi kullanın error_reporting(). Ayrıca display_errors yönergesinin açıklamasına da bakın.

PHP 5.3 ve sonrasında varsayılan değer şöyledir: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_KULLANIMDAN KALDIRILDI. Bu ayarla hata seviyeleri görüntülenmez E_NOTICE, E_STRICT Ve E_KULLANIMDAN KALDIRILDI. Bunları geliştirme sırasında görüntüleyebilirsiniz. PHP 5.3.0'dan önce varsayılan değer şuydu: E_ALL & ~E_NOTICE & ~E_STRICT. PHP 4'te varsayılan şuydu: E_ALL & ~E_NOTICE.

Yorum:

Dahil etme E_NOTICE geliştirme sırasında bir takım avantajlara sahiptir. Hata ayıklama için: NOTICE mesajları koddaki olası hatalar konusunda uyarıda bulunabilir. Örneğin, başlatılmamış değişkenlerin kullanılması benzer bir mesaja neden olacaktır. Bu, yazım hatalarını bulurken çok kullanışlıdır ve hata ayıklama sırasında zaman kazandırır. NOTICE mesajları aynı zamanda kötü stil konusunda da uyarıda bulunur. Örneğin, $diziŞöyle yazmak daha iyi: $dizi["öğe"] PHP yorumlamaya başladığından beri "öğe" bir sabit olarak. Eğer sabit değilse, PHP bu ifadeyi dizi öğesinin dize dizini olarak alır.

Yorum:

PHP 5'te yeni bir hata seviyesi mevcut E_STRICT. Çünkü E_STRICT dahil değil E_ALL, bu hata düzeyini açıkça etkinleştirmeniz gerekir. Dahil etme E_STRICT geliştirme sırasında da avantajları vardır. STRICT mesajları, kodunuzun daha iyi işlevsellik ve geriye dönük uyumluluk sağlamasına yardımcı olabilecek ipuçları sunar. Bu mesajlar, statik olmayan yöntemleri statik olarak çağırmak, kullanılan özellikte zaten tanımlı olduklarında uyumlu bir sınıfta özellikleri tanımlamak gibi şeyleri içerebilir ve PHP 5.3'ten önce kullanımdan kaldırılan bazı özellikler de seviye hataları oluşturacaktır. E_STRICTÖrnek oluştururken nesneleri referansa göre atamak gibi.

Yorum: PHP dışındaki PHP sabitleri

PHP sabitlerini PHP dışında, örneğin httpd.conf dosyasında kullanmak mantıklı değildir, çünkü bu gibi durumlarda tamsayı değerler gereklidir ( tamsayı). Üstelik zamanla yeni hata seviyeleri eklenecek ve sabitin maksimum değeri E_ALL buna göre büyüyecek. Bu nedenle belirtmeniz gereken yerde E_ALL olası tüm bit alanlarını kapsayacak şekilde büyük bir tamsayı belirtmek daha iyidir. Bu sayı örneğin şöyle olabilir: 2147483647 (yalnızca olası hataları değil, tüm olası hataları içerecektir) E_ALL).

ekran_hataları sicim

Bu ayar, hataların çıktının geri kalanıyla birlikte görüntülenip görüntülenmeyeceğini veya hataların kullanıcıdan gizlenip gizlenmeyeceğini belirler.

Anlam "stderr" akışa hatalar gönderir stderr yerine stdout. Değer PHP 5.2.4'te mevcuttur. Önceki versiyonlarda bu direktifin türü vardı boolean.

Yorum:

Bu işlevsellik yalnızca geliştirme amaçlıdır ve üretim sistemlerinde (örneğin, İnternet erişimi olan sistemler) kullanılmamalıdır.

Yorum:

display_errors çalışma zamanında ayarlanabilse de ( ini_set()), komut dosyasında önemli hatalar varsa bu hiçbir şeyi etkilemez. Bunun nedeni, yürütme sırasında programın beklenen eylemlerinin kontrolü alamamasıdır (yürütülmeyecektir).

display_startup_errors boolean

display_errors etkin olsa bile PHP'nin başlatılması sırasında oluşan hatalar görüntülenmez. display_startup_errors yönergesini yalnızca hata ayıklama amacıyla etkinleştirmenizi önemle öneririz.

Log_errors boolean

Hata mesajlarının kaydedileceği günlüğün seçilmesinden sorumludur. Bu sunucu günlüğü veya error_log olabilir. Bu ayarın uygulanabilirliği belirli sunucuya bağlıdır.

log_errors_max_len tamsayı

Log_errors'ın maksimum uzunluğunu bayt cinsinden ayarlar. Kaynakla ilgili bilgiler error_log'a eklenir. Varsayılan değer 1024'tür. Değerin 0 olarak ayarlanması log_errors uzunluğuna ilişkin sınırı kaldırır. Bu sınırlama günlüğe kaydedilen hatalar, görüntülenen hatalar ve $php_errormsg için geçerlidir.

Kullanıldıysa tamsayı, değer bayt cinsinden ölçülür. Bu SSS'de açıklanan kısa gösterimi de kullanabilirsiniz. görmezden_tekrarlanan_hatalar boolean

Tekrarlanan hataları kaydetmeyin. Bir hata, aynı dosyada ve aynı satırda meydana gelirse ve ayar devre dışı bırakılırsa, tekrarlanan bir hata olarak kabul edilir.

Ignore_repeated_source boolean

Yinelenen iletileri atlarken hataların kaynağını göz ardı edin. Bu ayar etkinleştirildiğinde, hangi dosya veya satırlarda meydana gelirse gelsin yinelenen hata mesajları günlüğe kaydedilmeyecektir.

Report_memleaks boolean

Ayar etkinleştirilirse (varsayılan), Zend bellek yöneticisi tarafından tespit edilen bellek sızıntıları hakkında bir rapor oluşturulacaktır. POSIX platformlarında bu rapor stderr'e gönderilecektir. Windows platformlarında OutputDebugString() işlevi kullanılarak hata ayıklayıcıya gönderilecektir; bu durumda raporu "DbgView" gibi yardımcı programları kullanarak görüntüleyebilirsiniz. Bu ayar, hata ayıklamaya yönelik yapılarda anlamlıdır. burada E_UYARI error_reporting listesine dahil edilmelidir.

Track_errors boolean

Etkinleştirilirse, meydana gelen son hata $php_errormsg değişkenindeki ilk hata olacaktır.

Html_errors boolean

Hata mesajlarındaki HTML etiketlerini devre dışı bırakır. Yeni HTML hata mesajı formatı, mesajlara bağlantılar ekleme ve kullanıcıyı hata sayfalarına yönlendirme yeteneği sağlar. Bu tür bağlantılardan docref_root ve docref_ext sorumludur.

Xmlrpc_errors boolean

Hata mesajı formatını XML-RPC mesaj formatına değiştirir.

Xmlrpc_error_number tamsayı

XML-RPC errorCode öğesinin değeri olarak kullanılır.

Docref_root sicim

Yeni hata biçimi, hatayı veya hataya neden olan özelliği açıklayan bir sayfaya bağlantı içerir. Hatanın ve özellik açıklamalarının bir kopyasını yerel olarak yerleştirebilir ve ini yönergesini bu kopyanın URL'sine ayarlayabilirsiniz. Örneğin, açıklamaların yerel bir kopyası şu adreste mevcutsa: "/Manuel/", sadece yaz docref_root=/manuel/. Ek olarak, dosya uzantılarını yerel kopyanızın açıklama dosyalarıyla eşleştirmekten sorumlu olan docref_ext yönergesinin değerini de ayarlamanız gerekir. docref_ext=.html. Harici bağlantıların kullanılması da mümkündür. Örneğin, docref_root=http://manual/tr/ veya docref_root="http://landonize.it/?how=url&theme=classic&filter=Landon &url=http%3A%2F%2Fwww.php.net%2F"

Çoğu durumda docref_root değerinin eğik çizgiyle bitmesini istersiniz "/" . Ancak bunun gerekli olmadığı zamanlar da vardır (yukarıdaki ikinci örneğe bakın).

Yorum:

Bu işlevsellik, özellik açıklamalarını ve hataları bulmayı kolaylaştırdığından yalnızca geliştirme amaçlı kullanıma yöneliktir. Kullanıma hazır üretim sistemlerinde (İnternet erişimi olan sistemler gibi) kullanmayın.

docref_ext sicim

Yorum:

docref_ext değeri noktayla başlamalıdır "." .

error_prepend_string sicim

Hata mesajından hemen önce yazdırılacak satır.

Error_append_string sicim

Hata mesajından sonra yazdırılacak satır.

Hata_günlüğü sicim

Hata mesajlarının ekleneceği dosyanın adı. Dosyanın web sunucusu kullanıcısı tarafından yazılmaya açılması gerekir. Özel bir değer kullanılıyorsa sistem günlüğü, ardından mesajlar sistem günlüğüne gönderilecektir. Unix sistemlerinde bu syslog(3), Windows NT'de ise olay günlüğüdür. Syslog, Windows 95'te desteklenmez. Ayrıca bkz.: sistem günlüğü(). Yönerge ayarlanmazsa hatalar SAPI günlüklerine gönderilecektir. Örneğin bu Apache hata günlükleri veya bir iş parçacığı olabilir stderr CLI komut satırı. Ayrıca bkz. işlev

Tasarımcılar, kalemlerinden çıkan web sitesi tasarımlarının en küçük ayrıntılarına dikkatle ince ayar yapmak için zanaatlarını geliştirmek için saatler harcıyorlar. Ancak kodun kalitesi çoğu zaman çok düşük kalır. Kanıta mı ihtiyacınız var? Ücretsiz CSS şablonlarının galerilerine göz atın. Şablonların %90'ı doğrulamayı geçemeyecek. Üstelik hataların çoğu çok ilkeldir ve düzeltilmesi çok kolaydır. Bu derste HTML kodunda doğrulamanın başarıyla tamamlanmasını engelleyen tipik hatalara bakacağız.

Kodu neden kontrol etmelisiniz?

Site tarayıcıda harika görünüyorsa neden kodu kontrol edesiniz? Kodu incelemeden önce sorulan tipik bir soru. Ancak site yalnızca kullanıcının görebileceği şeylerle sınırlı değildir. HTML sayfaları grafik efektleri değil, verileri sunmak için tasarlanmıştır. Veriler, İnternet'i kullanan geniş insan topluluğunun tamamı tarafından okunabilmelidir. Ve okuyucular sitenizde sunulan bilgileri almak için çok farklı teknolojiler kullanabilirler; örneğin, bir ses programı kullanabilir ve sayfanızda yazılanları dinleyebilirler.

Hatasız bir HTML sayfası genellikle çoğu tarayıcıda doğru şekilde görüntülenecek ve aynı zamanda gelecekteki teknolojilerle de uyumlu olacaktır. Burada çalışması SEO açısından çok önemli olan arama motorlarından bahsetmeye değer. Kimse onlara engel oluşturmak istemez ve temiz ve doğru kodun arama botları tarafından algılanması çok daha kolaydır.

Bu aynı zamanda bir profesyonellik meselesidir. Yanlış HTML kodu, bir web sitesindeki metindeki dilbilgisi hatalarına çok benzer. Ve müşteri koddaki hataları fark etmese de bu, sorunun özünü değiştirmez. Hiç kimse tasarımdaki gramer hatalarından hoşlanmaz, ancak bir şekilde HTML kodunu hatalı bırakmak aynı utanç verici davranış olarak kabul edilmez.

Genel hatalar

Ünlü CSS şablon galerisinin ilk sayfasındaki şablonlarda yakalanan hataları aşağıda bulabilirsiniz. Pek çok web sitesi harika, hatta harika görünüyor, ancak çoğu zaman kodun kalitesi tasarımın kalitesiyle eşleşmiyor. Bu hataların çoğu çok hızlı ve kolay bir şekilde düzeltilebilmesine rağmen.


En büyük hata kullanmamaktır Doküman türü! Etiket yok Doküman türü tarayıcının belgeyi oluşturmak için hangi dilin kullanıldığını "tahmin edeceği" anlamına gelir. Hatayı düzeltmek için sayfanızın belge türünü belirtmeniz gerekir.

Öğe kapatılmadı


HTML belgenizin herhangi bir yerinde bir etiketi açarsanız, onu uygun yerde kapatmanız gerekir. Bu konudaki unutkanlık sadece kodu kontrol ederken hatalara yol açmakla kalmaz, aynı zamanda şablonda da ciddi sorunlara neden olabilir. Şekil yazarın etiketi kapatmayı unuttuğu bir durumu göstermektedir

Kendi kendine kapanan öğelerde / karakterini atlar


Çoğu HTML öğesinin ayrı kapanış etiketleri vardır, örneğin: