2016-03-31 22 views
4

İçerik girişlerine sahip sınıf düzenim var. Ve her bir giriş karmaşık tip olabilir ve başka girişlerden oluşabilir. Yani fields_forRails'de iç içe geçmiş modeller için doğrulama hataları json olarak dönmenin daha iyi bir yolu?

<input autocomplete="off" class="string required form-control" id="order_entries_attributes_1459329286687_members_attributes_1459329286739_title" name="order[entries_attributes][1459329286687][members_attributes][1459329286739][title]" placeholder="Наименование" type="text"> 

kullanarak i raylar şeklinde oluşturulan alanlar var formda

class Order < ActiveRecord::Base 
    accepts_nested_attributes_for :entries 
end 

class Entry < ActiveRecord::Base 
    accepts_nested_attributes_for :members, allow_destroy: true 
end 

, ben bazı doğrulama hataları ile 2 girdileri ve 5 üye ile örneğin (2 için, düzenin bir formu göndermek başlıksız üyeleri) ve

class OrdersController 
    def update 
    if @order.update(order_params) 
     render json: @order 
    else 
     render json: @order.errors, status: :unprocessable_entity 
    end 
    end 
end 

kontrolöre geçer ve bana bu

döndürür

Sorun hangi girişin ve hangi üyenin içinde bir doğrulama hatası olduğunu bulamıyorum ve bu yüzden bu alanı vurgulayamıyorum. Ayrıca benzer hataları birleştirir. Ve bu sorun.

Gönderme sırasında benzersiz dizini geçirir (name niteliklerinde) ve yuvalar, iç içe model oluşturmak için doğru şekilde kullanır, hata yanıtı bu dizin içeriyorsa iyi olur.

Sunucudan güzel endeksli hatalar döndürmek için başka bir yol var mı ve ağrı olmadan json için rayları api olarak mı kullanıyorsunuz?

+0

onun raylarda çözüldü 5! –

+0

Rails 5'in bunu nasıl çözdüğüne dair belgeler için bir URL'niz var mı? –

+1

dokümanlar içinde bulamıyor, ancak burada basit bir kılavuz http://blog.bigbinary.com/2016/07/07/errors-can-be-indexed-with-nested-attrbutes-in-rails-5.html –

cevap

1

Sen gibi bir JSON cevap alırsınız

render json: { 
    order: { 
    entries: @order.entries.enum_for(:each_with_index).collect{|entry, index| 
     { 
     index => { 
      id: entry.id, 
      errors: entry.errors.to_hash, 
      members: entry.members.enum_for(:each_with_index).collect{|member, index| 
      { 
       index => { 
       id: member.id, 
       errors: member.errors.to_hash 
       } 
      } unless member.valid? 
      }.compact 
     } 
     } unless entry.valid? 
    }.compact 
    } 
} 

iç içe params Raylar aynı formata sahip güncellendi:

{ 
    order: { 
    entries: [ 
     0: { 
     id: 1, # nil, if new record 
     errors: {}, 
     members: [ 
      0: { 
      id: 7, # nil, if new record 
      errors: { 
       title: ["cant be blank"] 
      } 
      }, 
      1: { 
      id: 13, # nil, if new record 
      errors: { 
       title: ["cant be blank"] 
      } 
      } 
     ] 
     } 
    ] 
    } 
} 

P.S. Belki diğerleri bunu yapmanın raylarla entegre bir yolunu bilir. Aksi takdirde, bu gitmeli olarak Rails için iyi bir özellik talebi olabileceğini söyleyebilirim.

+0

Yanıtınız için teşekkürler Ancak başarıya ulaşana kadar kimliğim yok, tüm modeller (sipariş, giriş, üye) yeni kayıtlardır ve oluşturulmuştur fields_for kullanarak html örneğindeki büyük sayı, her yuvalanmış model için otomatik olarak oluşturulmuş alanlar gibi bir oluşturulmuş dizintir –

+0

Haklısınız. Rails, "nested_attributes" kullanırken kimliği olmayan yeni bir kaynakta 'fields_for 'kullanırken rasgele kimlikler atar. Bunu nasıl kopyalayabildiğimi merak ediyorum. –

+0

Kötüyüm, Rails 4, fields_for ve nested_attributes kullanarak yeni kayıtların kimliklerini otomatik olarak atamıyor (Ben şimdi test ettim). Belki de bunu daha önce hatırladığım gibi Rails 3.2'de kullandı. Kimliklerimi işlemek için cevabımı güncelledim. –

İlgili konular