update_attributes с проверками - PullRequest
0 голосов
/ 26 мая 2010

У меня есть следующий надуманный пример в Rails. Я хочу убедиться, что у модели Garage есть по крайней мере одна машина с этим.

class Garage
    has_many :cars
    validate :at_least_one_car
    accepts_nested_attributes_for :cars, :allow_destroy => true

    def at_least_one_car
        if cars.count == 0
          errors.add_to_base("needs at least one car")
        end
    end
end

class Car
    belongs_to :garage
end

В моей форме есть кнопка удаления, которая установит скрытое поле _delete в true для существующего автомобиля. Скажем, есть только один объект автомобиля, и я «удаляю» его в своей форме, если я делаю garage_object.update_attributes (params [: garage]), это удалит модель автомобиля и сделает объект гаража недействительным. Есть ли способ заставить не обновить атрибуты, если это сделает модель недействительной?

params = {
  :garage => {
    :car_attributes => {
      ["0"] => {
        _delete => true,
        # other attributes here
      }
    }
  }
}

Ответы [ 2 ]

1 голос
/ 26 мая 2010

Полагаю, вы можете добавить validates_presence_of :car, поэтому garage_object не будет обновляться, если нет связанных автомобилей.

class Garage
    has_many :cars
    validates_presence_of :cars
end

class Car
    belongs_to :garage
end
0 голосов
/ 26 мая 2010

Из того, что я знаю, ваш вопрос поможет вам в следующем.

Вы хотите некоторую проверку, которая должна проверяться при создании объекта, а не при его обновлении. используйте validate_on_create и validate_on_update методы для этого

class Garage
    has_many :cars


    def validate_on_create
        if cars.count == 0
          errors.add_to_base("needs at least one car")
        end
    end
end

class Car
    belongs_to :garage
end

Надеюсь, это поможет:)

EDITED

Что вы используете для удаления объекта

уничтожить или удалить

когда вы используете 'delete', никакие обратные вызовы не срабатывают

когда вы используете 'destroy', все обратные вызовы и фильтры запускаются до удаления объекта.

так что проверяйте и используйте 'destroy'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...