2017-01-02 29 views
7

Rayları 5. Bir kullanıcının kendi profilini güncelleyebilirsiniz bir sayfaya sahip ve bir şeyler yanlış giderse, sayfanın döndürülür kullanıyorumTarayıcı çubuğundaki URL'nin, bir kullanıcının hataları düzeltmek için bir forma döndüğünde nasıl değişmesini nasıl engellerim? Ben

def update 
    @user = current_user 
    if @user.update_attributes(user_params) 
     … 
     redirect_to url_for(:controller => ‘main’, :action => 'index') and return 
    end 

    render 'edit' 
    end 

onlar orijinal iade edildiğinde sorundur, sayfası, tarayıcı çubuğundaki URL, "http://localhost:3000/users/51" değerini okur. Bu, ziyaret ettikleri orijinal URL değildir ("http://localhost:3000/users/edit"). URL’nin olduğu gibi kalmasını nasıl sağlayabilirim?

Düzenleme: Bunu sözdizimi kullanabilirsiniz

  edit_users GET /users/edit(.:format)      users#edit 
       users GET /users(.:format)       users#index 
         POST /users(.:format)       users#create 
      new_user GET /users/new(.:format)      users#new 
      edit_user GET /users/:id/edit(.:format)     users#edit 
       user GET /users/:id(.:format)      users#show 
         PATCH /users/:id(.:format)      users#update 
         PUT /users/:id(.:format)      users#update 
         DELETE /users/:id(.:format)      users#destroy 
+0

've 'redirect_to' yöntemi gibi şeylerin mantıksal olarak doğru bir değer döndürdüğüne dair hiçbir garanti olmadığından geri dönmek kötü bir alışkanlıktır. Geri dönüş redirect_to yapmak çok daha iyidir ... böylece başarısız olacak bir şans yok. – tadman

+0

Normalde '@ user.update_attributes!' Seçeneğini ve yönlendirmeyi öneriyorum. Eğer bir problem güncellenirse, 'render (action: 'edit')' ile başlatabileceğiniz ve işlem yapabileceğiniz bir 'ActiveRecord :: RecordInvalid' hatası alırsınız. – tadman

+0

Yorumlarınızı okuduktan sonra yanıtın ne olduğu açık değil. Yürütme, modelde bir hata olduğu için açıkça 'oluşturma' düzenleme '' satırına aktarılıyor, ancak sonuçta elde edilen sayfadaki URL, öncekiyle aynı değil. –

cevap

2

tırmık koşularının Bu üretilir budur: Bunun aradığınız şey olabilir şüpheli

redirect_to :back 
+0

Bu işe yaramıyor. URL aynı olmasına rağmen, modele bağlı olan tüm hata iletileri, "render" yaparken daha önce kullandıkları gibi görünümde dağılmıyor. –

4

Ben senin varsayım doğru olmadığını iddia ediyorum. soruyorsunuz. Bir kullanıcı bir form düzeltildiğinde hataları düzeltmek için tarayıcı çubuğunda URL'nin nasıl değiştirilmesini engellerim?

Cevap ise kullanıcı hatalarını düzeltmek için formu yeniden gördüğünde tarayıcınızdaki URL değişmez. Çünkü form ilk kez gönderildiğinde URL zaten değişmişti. senin şu yolları olurdu bir routes.rb şu ortak sözleşmeler ile

(onları listelemek için rails routes kullanın): Eğer /users/:id/edit bir GET istek yaptığınızda

GET /users(.:format)   users#index 
POST /users(.:format)   users#create 
GET /users/new(.:format)  users#new 
GET /users/:id/edit(.:format) users#edit 
GET /users/:id(.:format)  users#show 
PATCH /users/:id(.:format)  users#update 
PUT /users/:id(.:format)  users#update 
DELETE /users/:id(.:format)  users#destroy 

kullanıcı güncelleme formu oluşturulur. Ancak, bu formdaki gerçek güncelleme isteği PATCH /users/:id'a gönderilir. Bu, tarayıcının zaten başka bir URL kullandığı anlamına gelir.

  1. şey Render: update yöntemi içinde

    temelde sadece iki seçenek var (URL'den /users/:id zaten olduğunu unutmayın). Eylem içerisindeki bir görünümü oluşturmak URL'yi aynı tutar (hala /users/:id olur), ancak bir formdaki hatalarını göstermek için örneğin @user'a atanan kullanıcıyı kullanma değişikliğine sahipsiniz. Bir güncelleştirme başarısız olduğunda Rails'in varsayılan davranışı budur.

  2. Tarayıcıyı başka bir URL'ye yönlendirebilirsiniz (örneğin, /users/:id/edit ya da ana sayfa gibi tamamen farklı bir URL'ye geri dönebilirsiniz). Bu, tarayıcının adres çubuğundaki URL'yi değiştirir. Ancak bir yönlendirme her zaman yeni bir GET isteği yapar, yani post aracılığıyla gönderilen bilgileri kaybederseniz ve @user için atanmış olan User örneğini kaybedersiniz. Bir GET'dan sonra kullanıcı veritabanından yeniden yüklenir ve bu nedenle hiçbir hata atanmaz. Rails'de, kullanıcı tarayıcıdaki yeniden yükle düğmesine basarsa, güncelleme başka bir POST önlemek için başarılı olduğunda yönlendirme kullanılır.

IMHO, sorunuzun yanıtı: Rails tarafından seçilen yoldan ayrılmadan ve tamamen farklı bir rota, denetleyici ve form ayarı oluşturmadan istediğinizi yapamazsınız. GET ve PATCH (veya POST) istekleri için aynı olan bir yolu yapılandırmanız gerekir. Ve denetleyici yönteminin, her iki istek türünü de farklı şekillerde ele alabilmesi gerekiyordu. Rails 2.0 kaynak yönlendirme tercih edilen yoldur. İstediğiniz şey, Rails 2.0

'dan önce yaygındı. Tavsiyem: Raylar kurallarına uyun. URL önemli değil, kimsenin umurunda değil. Rails sözleşmelerinin, bir form için başka bir URL'ye sahip olmamanın bir yararı yok.

+1

Rails'e yeni olduğum için, cevabın ne olduğunu tam olarak anlayamıyorum, ancak sorgumu "rake rotalarımı" içerecek şekilde düzenledim. "URL önemli değil, hiç kimse gerçekten umursamıyor" gelince, umurumda ve bu yüzden soruyu sordum. Eğer aptalca ya da aptalca hissediyorsan, bana alev atmaktan/azarlamaktan çekinmeyin ya da sadece cevap vermeyin, ama sorumum hala kalır. –

1

Rayları kullanmaya başladığımda da aynı şekilde mücadele ettim. tutmaya Ancak

...

Bir şey Raylar denir neden aklın "Raylar."

Raylar Rails denir çünkü Rails'in ana tasarım ilkesi demiryoluyla ilgilidir. Raylar, numaralı konfigürasyon üzerinden konvansiyonunu tercih ederek bir web sitesi oluşturmayı kolaylaştırır ve bu, işleri yapmak için tek ve tek bir yol, yani demiryolu benzetmesi anlamına gelir.

Rails'i kullanmayı tercih ettiğimizde, programcılar olarak, Rails'in kolay bir programlama deneyimi karşılığında bizim için yarattığımız demiryolu raylarına takılmayı kabul ediyoruz. Bir araba üzerinde bir trenin seçilmesi gibidir, yolda kalmanız gerekir, ancak alışverişte daha kolaylaşır.

Bu nedenle, herkesin cevabı büyük olasılıkla "yol boyunca ilerlemekten rahatsız olmayın, sadece tren yollarını takip edin."

Sen "Yapılandırma üzerinde Sözleşmesi" ve Rayların yaratıcısı olan DHH tarafından bu makalede Rails tasarım felsefesi hakkında daha fazla bilgi bulabilirsiniz - http://rubyonrails.org/doctrine

0

bu önerilmez bile, ne yapacağını mümkündür sen istediğiniz:

  • Kullanım render hataları görüntülemek için
  • (sizin görünümünde c routes.rb
  • kullanın bu rotada URL'ye /users/edit bir rota PUT veya PATCH'i oluştur halt form_for parametreleri)
  • Mağaza yere kullanıcı kimliği:
    • kullanıcıya oturum düzenlerken, ben oturumu kullanmayı öneriyoruz.
    • aksi halde ben
  • Güncelleme controller içerisinde current_user fonksiyon buna göre
0

bunu kullanın

redirect_to edit_user_path 
+1

Daha da iyisi, 'redirect_to edit_user_path (current_user)' Rails hangi kullanıcının kullanılacağını bilecek – Jaeger

0

tutun formda hidden_field_tag parametre eklemek için tavsiye ederim show ve edit her iki amaç için de çalışacak olan şablonlar aynıdır, aslında düzenlendiğinde sayfayı düzenler, başka bir şekilde şov sayfası olarak kabul edilir. hatalar mevcut olduğunda, hataları gösterecektir

İlgili konular