Когда он относится к потенциально комплексному действию пользователя, я большой поклонник Form Objects
. как видно наhttp://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/.
Мне удобно знать, что пользовательские взаимодействия и определения ActiveRecord являются отдельными.
Например, вы можете создать класс MaintenanceForm. Это послужит проверке ввода пользователя и сохранению его в базе данных.
class MaintenanceForm
include Virtus
extend ActiveModel::Naming
include ActiveModel::Conversion
include ActiveModel::Validations
attribute :vehicle, Vehicle
attribute :odometer_reading, Integer
validates :vehicle, presence: true
validates :maintenace, presence: true
validate :odometer_is_increasing
# … more validations, as needed …
# Forms are never themselves persisted
def persisted?
false
end
def save
if valid?
persist!
true
else
false
end
end
private
def odometer_is_increasing
# ensure that we don't accept an odometer reading less than our last record, if applicable
end
# Do all of the persistence heavy-lifting here.
def persist!
Maintenance.create({
vehicle_id: vehicle.id,
odometer: odometer_reading
#
# ...include others, as needed
})
vehicle.update_attributes({
odometer: odometer_reading
#
# ...include others, as needed
})
end
end
Решение для работы с вложенными_ресурсами тоже будет работать. Но я считаю, что вложенные_ресурсы слишком удобны и приводят к усилению связи/сложно поддерживать код. Хотя, ваш пробег может отличаться.
Я не вижу причин, почему этот код не работал. Вы можете использовать 'nested_resources' и' accepts_nested_attributes_for: vehicle' в своей модели обслуживания, чтобы Rails разрешал обновление транспортного средства, не найдя его и не обманул. – MrYoshiji
забыл добавить '@ vehicle.save' Очевидный. Благодаря! – Bruno