2016-04-07 16 views
1

Doğrudan soruya gitmek isterseniz, yalnızca son paragrafa gidin.İç içe öznitelikler doğrulamaları üst derlemede başarısız olur

A Paketi, birçok ürün dahil sahiptir Öğe polimorfik ve bağlantılı tablolar biri Burada Erişim (böylece Erişim Paketi eklenebilir bir Öğe ise) Eğer modelleri ve denetleyici olmasıdır.

class Pack < ActiveRecord::Base 
    has_many :pack_items, dependent: :destroy 
    has_many :items_included, through: :pack_items, source: :item 
    accepts_nested_attributes_for :pack_items, allow_destroy: true 

    validate :valid_max_value, if: :infinite_item? 
end 

class Item < ActiveRecord::Base 
    has_many :pack_items, dependent: :restrict_with_error 
    has_many :packs, through: :pack_items 
end 

class Access < ActiveRecord::Base 
    has_one :item, as: :itemable, dependent: :destroy 
    has_one :entitlement, as: :entitlementable, dependent: :destroy 
    accepts_nested_attributes_for :item, allow_destroy: true 
    accepts_nested_attributes_for :entitlement, allow_destroy: true 
    validate :valid_max_value, if: :infinite? 

    private 

    def infinite? 
    entitlement.infinite 
    end 
end 

class PacksController < BaseController 
    def update 
    @pack = Pack.find(params[:id]) 
    if @pack.update(permitted_params) 
     ... 
    end 
    end 

    private 

    def permitted_params 
    params.require(:pack).permit(item_attributes: [:id, :name, :max_purchasable], 
           pack_items_attributes: [:id, :item_id, :amount, :_destroy]) 
    end 
end 

paketinde bir importan doğrulama yok "valid_max_value. Bir paket içindeki sonsuz Erişim varsa, Pack'in MAX_VALUE Bir paket oluşturduğunuzda Mükemmel çalışıyor ve ben eklemek daha yüksek 1. olmamalıdır bazı erişir, fakat sorun şudur:

  • iki Öğeler ile Paketi yüklü sonsuz olduğunu bir Erişim ve ortak Erişim (sonsuz değildir) o içeride sonsuz Erişim olduğu için şimdiye Pack'in MAX_VALUE 1 olmalıdır..
  • Artık bu Paketi düzenliyorum ve sonsuz Erişimi siliyorum, şimdi yapabilirim Örneğin, paketin içinde kısıtlama olan bir Erişim olmadığı için, daha yüksek bir max_value, 5 seçin.
  • Güncelleştirmeyi tıklattığımda, geçersiz Erişim'in silinmesinden önce valid_max_value doğrulaması çalıştığı için geri alma var, bu nedenle doğrulama bir alt alana bağlı olduğundan max_value'nun geçersiz olduğunu söylüyor. Kısacası

, sorum geçerli: Nasıl daha önce iç içe öğeleri silmek ebeveyn doğrulama çalıştırabilirsiniz?

cevap

1

Aslında, doğrulama önce öğeleri silmek silinecek olan öğeler

+0

Serin göz ardı edilecektir anlaşılması için, doğrulamalarındaki yerine marked_for_destruction? kontrol etmek zorunda değilsiniz! Bu harika bir yaklaşım. Ama şimdi onu nasıl düzgün kullanabilirim? çünkü ilişkilendirme yoluyla bir has_many, ve doğrulamada gerekli olan öğe yerine pack_item imhasını işaretler. Öğeyi ilişkiden almak için kodlayabilirim ama daha iyi bir yol olduğunu bilmek isterim. – Quin

+0

@ Başımın üst kısmından çık ve yol git. – Vasfed