2013-06-03 76 views
0

我想從我的maintenance_controller更新我的車型。我該怎麼做呢?或者這是錯誤的方法?我的維修視圖抓取了應存儲在車輛模型中的里程錶值。來自不同控制器的更新模型

class Maintenance < ActiveRecord::Base 
    belongs_to :vehicle 

maintenance_controller:

@maintenance = Maintenance.new 
@maintenance.invoice = params[:invoice] 
.... 
@vehicle = Vehicle.find(params[:vehicle_id]) 
@vehicle.odometer = params[:odometer] 
.... 
+1

我看不到任何理由爲什麼這段代碼不起作用。您可以在維護模型中使用'nested_resources'和'accep_nested_attributes_for:vehicle'來讓Rails處理車輛更新,而無需查找並更新它。 – MrYoshiji

+0

忘了添加'@ vehicle.save'明顯。謝謝! – Bruno

回答

0

當它涉及到一個潛在的,複雜的用戶行爲,我的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太方便了,導致耦合度增加/難以維護代碼。雖然,你的里程可能會有所不同

1

@vehicle.save

由於@MrYoshiji指出,該代碼是好的,只是需要將其保存。

相關問題