2016-04-05 31 views
0

Bir ilişki bulunamadığında, iç içe geçmiş form ilişkilendirmeleri için NotFound istisnasından kurtulmam gerekiyor.Raylar 4: Kaçış Bulunamadı Yuvalanmış form için hata bulunamadı

Örneğin, ben

class User < ActiveRecord::Base 
    has_many :user_selection_criteria 
    accepts_nested_attributes_for :user_selection_criteria, :reject_if => lambda { |t| t['brand_id'].nil? }, :allow_destroy => true 
end 

ve özelliklerini günceller

if @user.update_attributes user_params 
    render 
else 
    render json: @user.errors, status: :unprocessable_entity 
end 

var parametreler bu izin yoktur ve herşey yolunda.

Bu özniteliklerle iç içe form kullanıyorum. vb

user_selection_criteria_attributes[0][id]  
user_selection_criteria_attributes[0][brand_id]  
user_selection_criteria_attributes[0][_destroy] 
user_selection_criteria_attributes[1][id]  
user_selection_criteria_attributes[1][brand_id]  
user_selection_criteria_attributes[1][_destroy] 
user_selection_criteria_attributes[2][id]  
user_selection_criteria_attributes[2][brand_id]  
user_selection_criteria_attributes[3][_destroy] 

...

Hiçbir sorun yok, i:

  • bırak kimliği boş - yeni bir rekor mevcut kaydın

  • kullanın kimliği oluşturulur - İlgili kayıt güncellenir. i var olmayan kayıt id kullandığınızda Başka bir kullanıcı bu rekoru silindiğinde

Ama, örneğin, i t ID = 12

ile Kullanıcı için ID = 13 ile UserSelectionCriterium bulmak bir hatayı kalamayasın ' olsun

i

begin 
    if @user.update_attributes user_params 
    render 
    else 
    render json: @user.errors, status: :unprocessable_entity 
    end 
escape 
    render 
end 

Hata kaçan, ancak nitelikleri kaydedilmez kullanın. Ama bu bekleniyor.

Soru: Bu hatayı nasıl susturur/kaçar, bu kaydın artık olmadığını görmezden gelebilir ve diğer geçerli ilişkileri kaydedebilir miyim?

I.I.I.e. 13 ile iç içe geçmiş ilişki mevcut olmadığında, ancak 14 ile ilişki var ise, ilişki 13 yok sayılır ve 14 normal şekilde işlenir.

+0

olasılığınız bunun olmasına ve hangi sıklıkta? Şahsen rahatsız etmem. 'Find_by (id: ...)' gibi bir hata yapmayan ve bir doğrulama hatası döndüren bir bulucu kullanırdım. – Mohamad

cevap

1

Böyle rekor exsited gelmez oluyor bu kimlikleri, filtre (ideal, kendi kodunuzu kullanın):

def some_params 
    params.require(:user).permit(user_selection_criteria_attributes: [:id, :brand_id]).tap do |white_list| 
     white_list[:user_selection_criteria_attributes].each do |key, value| 
     if value[:id].present? && UserSelectionCriteria.find_by(id: value[:id]).blank? 

      white_list[:user_selection_criteria_attributes].delete(key) 
     end 
     end 
    end 
    end 
+0

Önceden unuttum) .tap Teşekkürler, bu harika çalıştı. –

İlgili konular