2013-06-03 15 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' и' accepts_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 

Решение для работы с вложенными_ресурсами тоже будет работать. Но я считаю, что вложенные_ресурсы слишком удобны и приводят к усилению связи/сложно поддерживать код. Хотя, ваш пробег может отличаться.

1

@vehicle.save

Как @MrYoshiji отметил, что код хорошо, просто необходимо, чтобы сохранить его.