我有一个处理2个关联对象的表单对象。我正在尝试对表单对象进行一些验证,但是没有取得多大成功。
我认为问题是我正在验证的属性被委托给模型对象,但我不确定如何处理这种情况:当显示表单时,这些属性需要从实际模型中提取在编辑模式下显示表单上的值,但是当我更新表单时,我需要验证提交的参数,而不是从模型本身中提取的值。
我想到的是使用从关联模型中提取属性的EditBorrowerForm
对象和执行所有验证并更新模型的UpdateBorrowerForm
。但对于一些微不足道的事情来说,这似乎是一项额外的工作。
我已经看到很多用于CREATE操作的表单对象(在将它们传递给模型之前只验证字段),但是没有看到UPDATE操作的任何好例子(你需要从中提取字段)模型以及更新它们。)
以下是我正在使用的模型:
class Client < ActiveRecord::Base
has_many :borrowers
end
class Borrower < ActiveRecord::Base
belongs_to :client
end
我的表单对象:
class BorrowerForm
include ActiveModel::Model
attr_accessor :client, :borrower
delegate :first_name, :last_name, :date_of_birth, to: :client
delegate :citizenship, :marital_status, to: :borrower
validates :first_name, :last_name, :citizenship, presence: true
def initialize(borrower)
@borrower = borrower
@client = @borrower.client
end
def update_attributes(params)
# Never validates properly...
if valid?
ActiveRecord::Base.transaction do
borrower.update_attributes(params.slice(:citizenship, :marital_status)
client.update_attributes(params.slice(:first_name, :last_name, :date_of_birth)
end
true
else
false
end
end
end
控制器:
class BorrowersController < ApplicationController
def edit
@borrower = BorrowerForm.new(Borrower.find(params[:id])
end
def update
@borrower = BorrowerForm.new(Borrower.find(params[:id])
if @borrower.update_attributes(params)
redirect_to :index
else
render :edit
end
end
end