5

Sorunun açık olup olmadığı için üzgünüm, sadece Rails ile çalışmaya başlıyorum.
Ben artık çeşitli denetleyicisi yöntemleri bir aşağıdaki kod:Rails Newbie: Denetleyicide hata işleme ile ilgili öneriler

respond_to do |format| 
    if @project.save 
     format.html { redirect_to(edit_project_url(@project), :notice => '#{user.name} added to #{role}.') } 
     format.js 
    else 
     format.html { render :action => "edit" } 
     format.js #... 
    end 
end 

Yani soru, bütün yöntemlerde hatalar için aynı şeyi yapmanın en iyi yolu nedir nedir?
save! kullanıp rescue_action içinde mi kullanmalıyım?

Ya da kendi respond yöntemimi yapmalı ve save geçişini bir blokta geçirmeliyim?

cevap

16

Genellikle, daha sonra blokta olduğu gibi kaydetme ve kurtarmanın istisna geliştirme varyantını kullanmak daha uygun olur. İstisnaların avantajı, işlemlerden vazgeçmeleridir.

def create 
    @project.save! 

    respond_to do |format| 
    format.html { redirect_to(edit_project_url(@project), :notice => '#{user.name} added to #{role}.') } 
    format.js 
    end 

rescue ActiveRecord::RecordInvalid 
    respond_to do |format| 
    format.html { render :action => "edit" } 
    format.js #... 
    end 
end 

Bunu bir defada birden fazla nesneyi kaydetmeye çalışırken iç içe if tabloların bir yığın çıkış yolu kavga etmek gerçekten zor alır göreceksiniz, ama istisnalar için basit rescue bunu düzgünce idare edecek .

Bunlardan herhangi biri patlarsa, bir istisna alırsınız. Tümünün doğrulama hatalarını görüntülediğinden emin olmak için, her birini başlatmak için .valid? numaralı telefonu aramanız gerekebilir veya başarısızlıktan sonra test edilmeden bunları elde etmiş olursunuz.

+0

Bu iyi bir fikir gibi görünüyor, ama neden iskele böyle gitmez? Ayrıca, bu tür yöntemler varsa 'rescue_action' kullanılmasını tavsiye ettiğinizi varsayalım? –

+0

Tamam, birden fazla yöntem için "rescue_from" veya "rescue_action_in_public" işleyicisini kastettiğinizi varsayacağım, burada Chubas bu sorunun bir alt kümesidir ve bunu bir yanıt olarak kabul etmeliyim. –

+0

Genel bir kural olarak, "Rescue_From" işlevini, kolayca halledilemeyen şeyler ve "halledebileceğim" durumda kullanıyorum. Bir "oluştur" başarısız olduğunda, genellikle "yeni" formunu yeniden oluşturursunuz. Daha soyut bir şey genellikle güzel bir "Uh oh" sayfası döndürür. – tadman

3

if @object.save modelini kullanmak kötü bir şey değil. Ancak, denetleyicinizdeki tüm eylemleriniz için tam olarak aynı şeyi yapıyorsanız, bir rescue_from eylemi tanımlayabilirsiniz.

Something like

class MyController < ActionController::Base 
    rescue_from ActiveRecord::RecordInvalid do 
    render :action => edit 
    end 
end 
+0

Evet, bu benim seçeneklerimden biriydi, ama bu tür ihtiyaçlar! '', Değil mi? İskele varsayılan olarak neden bu şekilde gitmiyor biliyor musunuz? Bana göre daha iyi görünüyor. –

+0

Sizin ve andtadman'ın ikisi de birbirini tamamlıyor gibi görünüyor, bu yüzden ikisini de kabul edersem kabul ediyorum, ama ne yazık ki bir tane seçmeliydim. –

İlgili konular