2009-09-29 6 views
1

У меня возникает проблема при попытке применить условие if if к проверке validates_associated. Условие if работает для validates_presence_of, но не для validates_associated, и форма (с двумя моделями в ней) работает правильно, за исключением того, что проверка все еще возвращает ошибку, независимо от того, является ли условие if истинным или ложным.Rails - validates_associated with: if condition

validates_associated :departures, :if => :cruise? 
validates_presence_of :ship_name, :if => :cruise? 

def cruise? 
    item_marker == 1 
end 

# I even tested it using this, and it still returned a validated_associated error 
def cruise? 
    false 
end 

#form item 
<%= departure_form.date_select :date, :index => (departure.new_record? ? '' :  
departure.id), :start_year =>Time.now.year, :order => [:month, :day, :year ], 
:prompt=>true %> 

Я использую дату выбора для: поля вылета, с запросом для значений по умолчанию (то есть первый выбранный вариант для каждого поля с иметь значение = «»). Я считаю, что это то, что вызывает проблему. Я могу удалить приглашение и просто удалить даты отправления для non_cruises в контроллере, но это кажется неаккуратным. есть ли у кого-нибудь предложения? Обратите внимание, что в этом коде используются части рецепта «Обработка нескольких моделей в одной форме» Райана Бейтса.

+0

Должно работать? ^^ – Lichtamberg

+0

Coudl Вы покажете мне свою модель? Какие у вас отношения? – Lichtamberg

ответ

0

Я понял, что случилось. Моя новая функция построения отправлений создавала объекты отправления для всех предметов, будь то круизы или нет. Я добавил круизы? в коде ниже, и теперь он работает правильно.

has_many :departures, :dependent => :destroy 

def new_departure_attributes=(departure_attributes) 
departure_attributes.each do |attributes| 
    if cruises? #new if statement 
    departures.build(attributes) 
    end 
end 
end 
#the following two methods are only used for update actions 
#(the error happens in new/create as well) 
def existing_departure_attributes=(departure_attributes) 
    departures.reject(&:new_record?).each do |departure| 
    attributes = departure_attributes[departure.id.to_s] 
    if attributes 
     departure.attributes = attributes 
    else 
     departures.delete(departure) 
    end 
    end 
end 

def save_departures 
    departures.each do |departure| 
    departure.save(false) 
    end 
end