當它涉及到一個潛在的,複雜的用戶行爲,我的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_resource解決方案也可以工作。但是我發現nested_resources太方便了,導致耦合度增加/難以維護代碼。雖然,你的里程可能會有所不同
我看不到任何理由爲什麼這段代碼不起作用。您可以在維護模型中使用'nested_resources'和'accep_nested_attributes_for:vehicle'來讓Rails處理車輛更新,而無需查找並更新它。 – MrYoshiji
忘了添加'@ vehicle.save'明顯。謝謝! – Bruno