2009-05-04 33 views
44

Birden çok eylemi olan bir denetleyicim var: yıl ve: ay URL'den öznitelikleri. için özel bir yöntem check_date yaptım, tarihin geçerli olduğunu kontrol edin ve tarihin gelecekte olmadığını kontrol edin. redirect_to sonra kontrolör yürütülmesine biten bir raylar yoluredirect_to kullandıktan sonra denetleyici yürütmeyi nasıl durdurabilirim? (Rayları Kullanma)

def check_date(year, month) 
    if month < 1 || month > 12 || year < 2000 
    flash[:notice] = I18n.t 'archive.invalid_date' 
    redirect_to :action => 'index' 
    elsif year > Date.today.year || (year == Date.today.year && month > Date.today.month) 
    flash[:notice] = I18n.t 'archive.no_future' 
    redirect_to :action => 'month_index', 
     :year => Date.today.year, 
     :month => Date.today.month, 
     :type => params[:type] 
    end 
end 

var mı?

Ben redirect_to sonra bir özel durum için veya check_date bir değer döndürmek ve onu çağıran her eylemde kontrol etmek ya vardır aklınıza gelebilecek Yolları -

def month_index 
    year = params[:year].to_i 
    month = params[:month].to_i 
    if !check_date(year, month) 
    return 
    ... 
end 

gibi bir şey Ama var acaba bazı güzel raylar bunu yapmanın yolu. Redirect_to raylarının çağrılmasının durmasını istediğimi umarak yarısını aldım, ama bu gerçekleşmiyor.

cevap

35

Muhtemelen filtreleri kullanmak istiyorsunuz.

Eğer ararsanız sizin check_date kontrolörde before_filter bir şekilde, bu hale ya hiç eylem yöntemini çağırarak gelen kontrolörü önleyecektir yönlendirilir gerçeği. Orada bitiyor ve sonra.

+1

Bu, askerin problemini çözebilir ancak buraya vrish88'ler gibi bir çözüm bekledim. – iphone007

6

redirect_to sadece tamamlandığında rayların ne yapılacağını anlatır. Diğer render veya redirect_to direktiflerini gerçekten istedikten sonra eklediyseniz raylar karışacaktır, bu yüzden sadece redirect_to'dan sonra kontrolörden geri dönün - bir şeyler yapmak için 'normal' raylar.

16

Sen eylem kod yürütme Ayrıca yapabilirsiniz

+4

aslında, sadece bir dönüş yapacağız. – kch

+3

evet ama özel bir işlevde olduğunda, daha otomatik bir yol arıyordum, bu yüzden daha otomatik bir yol arıyordum - bu yüzden, daha önce bir yol arıyordum - –

+0

@HamishDowner gibi. Bu durumda, özel fonksiyonun bir formu yerel olarak döndürmesi gerekir. ne yapıyorsa, yani başka semboller döndürdüğünde bir sembol, normalde "true" döndürürse bir 'false ', normalde başka bir veriyi döndürürse, ya da belki de bir değişken veya bir istisna şekli bile varsa Bu yardımcı için en iyi görünüyorsa. Ardından denetleyici, özel işlev ancak negatif durumu ifade eder ve buna tepki vermelidir.Denetleyici yönteminin işlevini özel bir işleve karıştırmak, yalnızca hızlı bir şekilde dağınık olmaz, yeniden kullanılabilirliği engeller. –

47

durdurmak istediğiniz yere

return false 

içinde atabilir:

return redirect_to :action => 'index' 

ve

return redirect_to :action => 'month_index', 
    :year => Date.today.year, 
    :month => Date.today.month, 
    :type => params[:type] 

daha iyi görünüyor çünkü kendi satırına bir dönüş (IMHO).

+0

Veya 'redirect_to: action => 'index' ve geri dön ' – Rigo

0

OP'nin redirect_to işlevi hakkında kafası karıştığını düşünüyorum. İşlemin sonunda yeniden yönlendirme

redirect_to. Bununla birlikte, denetleyici işlevinin geri kalanı her zamanki gibi yürütülür. Yapmanız gereken tek şey (diğer insanlar tarafından gönderilenler gibi), herhangi bir diğer işlev çağrısında olduğu gibi bir geri dönüş eklemektir.

İlgili konular