2013-04-08 7 views
6

Jestem nowy na szynach, więc wszelkie rady są mile widziane.Zagnieżdżone atrybuty: niechciana walidacja pomimo reject_if: All_blank

Mam klasy Wstęp ze zagnieżdżone atrybutów adresy

/app/models/entry.rb

class Entry < ActiveRecord::Base 
    has_many :addresses, :dependent => :destroy 
    accepts_nested_attributes_for :addresses, 
           :allow_destroy => true, 
           :reject_if => :all_blank 
end 

z klasą adresów jak ten

/app/models/address.rb

class Address < ActiveRecord::Base 
    belongs_to :entry 
    validates :zip, :presence => true 
end 

A w postaci zagnieżdżonych mam

/app/view/entries/_form.html.slim

= simple_form_for(@entry) do |f| 
    = f.error_notification 
    - @entry.addresses.build 
    .form-inputs 
    = f.simple_fields_for :addresses do |address| 
     = render 'address_form', :f => address 

Chodzi o to, że gdy formularz jest renderowane, „Build” stworzy pusty „adres” oprócz aktualnych adresów wymienionych w bazie danych. Gdy zmiany zostaną zapisane, jeśli utworzony nowy adres będzie nadal pusty, zostanie odrzucony i nie zostanie zapisany w bazie danych.

Jednak sprawdzanie poprawności w pliku address.rb dokonuje sprawdzenia przed zapisaniem, dlatego użytkownik nie może kontynuować akcji składowania. Czy coś mi zostało?

Odpowiedz

0

Spróbuj przekazać false jako argument do save, aby pominąć sprawdzanie poprawności.

1

Możesz spróbować jawnie nazwać atrybuty w swoim modelu adresu, które zostaną sprawdzone przed utworzeniem nowego, pustego. Coś takiego:

# in app/models/entry.rb 

accepts_nested_attributes_for :addresses, reject_if: lambda {|attributes| nested_address_is_empty?(attributes) } 

private 

def self.nested_address_is_empty?(attrs) 
    attrs['line_1'].blank? && attrs['line_2'].blank? && attrs['zip'].blank? 
end 
Powiązane problemy