2011-02-18 16 views
9

geçersiz form gönderimleri işlemek için doğru yolu. Sorun, geçersiz form gönderimleriyle nasıl başa çıkılacağıyla ilgili.Ben raylar yeniyim ve ben geçtiniz öğreticiler bazı işlerinizi ettik yolu ile kabul emin değilim Raylar

class ThingsController < ApplicationController 


    # POST /things 
    def create 

    @thing = Thing.new(params[:thing]) 

    if @thing.save 
     flash[:notice] = 'Thing created' 
     redirect_to(@thing) 
    else 
     render :action => :new 
    end 

    end 

thing.save başarısız @ kullanıcı gitti şeyin bir flaş ile birlikte önceden doldurulmuş aşımı o sadece girilen değerlerle aynı form ile sunulduğunda: şeyler yapmanın standart yol gibi görünüyor yanlış. Şimdiye kadar çok iyi, şu anda URL,/things/new'den bir şeye değişti, ki bunun yerine indeks görünümünü oluşturması bekleniyordu. kullanıcı sayfayı yeniler Ayrıca

, şu an indeks görünümünde bakıyor. Eğer geri tıklarsa, her zaman kaçınmaya çalıştığım formu yeniden göndermesi istenir. Yeniden yönlendirme_to (new_thing_path) ise, kullanıcının önceki sunumu hata mesajları gibi kaybolur.

RESTLE, bu yöntemin "doğru" olabileceğinin farkındayım, çünkü bir nesnenin oluşturulması POST'lerin/şeylerin sonucu olmalıdır, ancak kullanıcı arabirimi açısından bilhassa umurumda değil.

yapabilirdim "elle" Geri new_thing_path onu yönlendirmek sonra görüntülenecek, kullanıcının oturumda geçersiz @thing nesneyi kaydetmek, ama bu kesmek gibi hissediyor. Sadece bunu yapmanın bir "raylar yolu" olması gerektiği gibi görünüyor.

Fikirler?

+0

Rails çekirdeği ile ilgili tam olarak aynı şikayetim var ama siz onu yaptığımdan daha iyi ifade ettiniz :) İyi soru. – Andrew

cevap

3

Varsayılan olarak, resources :things belirtmeyi belirttiğinizde, yeni bir şey oluşturmak için POST yolu /things adresindedir.

resources :things, :except => [ :create ] do 
    post "create" => "things#create", :as => :create, :path => 'new', :on => :collection 
end 
: Önerilmese de

create_things POST /things/new(.:format)  {:action=>"create", :controller=>"things"} 
     things GET /things(.:format)   {:action=>"index", :controller=>"things"} 
    new_thing GET /things/new(.:format)  {:action=>"new", :controller=>"things"} 
    edit_thing GET /things/:id/edit(.:format) {:action=>"edit", :controller=>"things"} 
     thing GET /things/:id(.:format)  {:action=>"show", :controller=>"things"} 
       PUT /things/:id(.:format)  {:action=>"update", :controller=>"things"} 
       DELETE /things/:id(.:format)  {:action=>"destroy", :controller=>"things"} 

, aşağıdaki rota ile bu sonucu elde edebilirsiniz: Daha fazla böyle bir şey istedikleri gibi

things GET /things(.:format)   {:action=>"index", :controller=>"things"} 
      POST /things(.:format)   {:action=>"create", :controller=>"things"} 
new_thing GET /things/new(.:format)  {:action=>"new", :controller=>"things"} 
edit_thing GET /things/:id/edit(.:format) {:action=>"edit", :controller=>"things"} 
    thing GET /things/:id(.:format)  {:action=>"show", :controller=>"things"} 
      PUT /things/:id(.:format)  {:action=>"update", :controller=>"things"} 
      DELETE /things/:id(.:format)  {:action=>"destroy", :controller=>"things"} 

geliyor: İşte rake routes için çıkış var

Ayrıca formlarınızı, doğru yola POST yapmak için değiştirmeniz gerekir.

Tüm bu

sorunuzu sahip URL'lerin açıklaması doğru ses yok, söyleniyor. Aşağıdaki liste: Yeni thing ( /things/new de göndererek bir form), formu yeniden göndermek için istemleri geri tıklandığında /things
  • için /things/new den

    1. URL değişiklikleri gönderdikten sonra
    2. Canlandırıcı things#index
    gösterir

    Bu değil kendi Raylar 3 uygulamalar içinde yaşamaya işlevdir.Bunun yerine, bulmak: Yeni thing (/things/new de göndererek bir form), /things için /things/new den

    1. URL değişiklikleri (bu aynıdır)
    2. geri tıklandığında için kullanıcı geri götürür gönderdikten sonra olmayan -submitted formu (yeniden yazı için hiçbir istek)
    3. Canlandırıcı istemleri (Bence beklendiği gibi) Bu eski bir soru olduğunu biliyorum
  • +1

    Teşekkürler Brandon. Bu, yine de varsayılan işlevselliği umursamama rağmen yararlıdır. Ben sadece mümkün olduğunca önlemek için javascript doğrulama kullanacağım düşünüyorum. – dearlbry

    0

    formu yeniden ancak bunlarla Son zamanlarda oynadığım bir yaklaşım, aksi takdirde gerekmeyecek olsa bile formu AJAX ile göndermek. Bu, rotaların gideceği yere kadar varsayılan oluşturma/güncelleme işlemine göndermenizi sağlar, ancak tarayıcıdaki URL değişmez. Yanıt,/index sayfasına bir bağlantı ile başarılı bir başarı için 200 veya başarılı bir kayıtta yönlendirdiğiniz her yerde veya verilerin geçersiz olması durumunda hata mesajıyla birlikte "400 kötü istek" olabilir.

    En büyük düşüş, hata iletilerinin ve geçersiz alanların görüntülenmesi artık tamamen istemci tarafındaki javascript'in sorumluluğudur. Bu daha küçük bir sorun haline gelir ve istemci tarafında Backbone veya KnockoutJS gibi bir şey kullandığınızda iyi bir şey bile olabilir.

    İlgili konular