Rails从关联表单中保存数据

时间:2013-04-29 06:34:47

标签: ruby-on-rails-3 netzke

如何从关联表单中获取数据并将其插入主模型的关联表中?

class Supplier < ActiveRecord::Base  
  has_one :account, foreign_key: "acc_sup_id", :autosave => true   
  self.primary_key = 'sup_id'  
end  

class Account < ActiveRecord::Base  
  belongs_to :supplier, foreign_key: "acc_sup_id"  
  self.primary_key = 'acc_id'  
  self.table_name = 'accounts'  
end

我正在为供应商和帐户提供合并表格。当我提交时,我需要找到一种方法将相应的值插入供应商和帐户。问题是供应商值正确插入但不是帐户。

我在几个论坛,小组甚至是筹码中都提出了同样的问题,但似乎没有人给出令人信服的答案。

2 个答案:

答案 0 :(得分:0)

基本策略是首先查看提交表单时提交的参数。您可以在控制器操作中添加一行,例如raise params.inspect来查看。确保这些段落包含您需要的所有数据;如果没有那么在视图中存在一些产生该形式的问题。

让所有数据进入控制器操作后,您需要更改控制器操作,以便正确解释所有数据并将其放入正确的模型中。

除非您显示视图的代码,执行params.inspect的结果以及获取数据的控制器操作的代码,否则我无法提供任何更具体的建议。

答案 1 :(得分:0)

试试这个。

假设您有orderscustomers个表,并且您希望从订单表单对客户执行CRUD操作。

客户模型非常简单

class Customer < ActiveRecord::Base
  attr_accessible :name
end

Order模型必须为所有客户的属性(attr_accessor构造)提供虚拟属性。 customers的CRUD是通过回调提供的。也可以使用验证。

class Order < ActiveRecord::Base
  attr_accessor :customer_name
  attr_accessible :description, :number, :customer_name
  belongs_to :customer

  validates_presence_of :number
  validates_presence_of :description
  validates_presence_of :customer_name

  before_save :save_customer
  after_find :find_customer
  after_destroy :destroy_customer

  protected

  def save_customer
    if self.customer
      self.customer.name = self.customer_name
    else
      self.customer = Customer.create(name: self.customer_name)
    end
    self.customer.save
  end

  def find_customer
    self.customer_name = self.customer.name
  end

  def destroy_customer
    self.customer.destroy
  end
end

订单模型的示例网格。

class Orders < Netzke::Basepack::Grid
  def configure(c)
    super
    c.model = 'Order'
    c.items = [
      :description,
      :number,
      :customer_name
    ]
    c.enable_edit_inline = false
    c.enable_add_inline = false
  end

  def preconfigure_record_window(c)
    super
    c.form_config.klass = OrderForm
  end
end

订单模型的示例表单。

class OrderForm< Netzke::Basepack::Form
  def configure(c)
    super
    c.model = 'Order'
    c.items = [
      :description,
      :number,
      :customer_name
    ]
  end
end