簡體   English   中英

從其他控制器更新模型

[英]Update model from different controller

我想從我的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]
....

@vehicle.save

正如@MrYoshiji指出的那樣,代碼很好,只需保存即可。

當涉及到潛在的復雜用戶操作時,我非常喜歡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太方便了,並導致耦合增加/代碼難以維護。 雖然,您的里程可能會有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM