Rails 4:2个模型的更新操作的表单对象

时间:2016-03-07 18:35:12

标签: forms ruby-on-rails-4

我有一个处理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

0 个答案:

没有答案