8

我有 3 个模型:报价、客户和项目。每个报价都有一个客户和一个项目。当我按下提交按钮时,我想在他们各自的表格中创建一个新报价、一个新客户和一个新项目。我查看了其他问题和 railscast,要么它们不适用于我的情况,要么我不知道如何实施它们。

报价单.rb

class Quote < ActiveRecord::Base
  attr_accessible :quote_number
  has_one :customer
  has_one :item
end

客户.rb

class Customer < ActiveRecord::Base
  attr_accessible :firstname, :lastname
  #unsure of what to put here
  #a customer can have multiple quotes, so would i use has_many or belongs_to?
  belongs_to :quote
end

项目.rb

class Item < ActiveRecord::Base
  attr_accessible :name, :description
  #also unsure about this
  #each item can also be in multiple quotes
  belongs_to :quote

引号_控制器.rb

class QuotesController < ApplicationController
  def index
    @quote = Quote.new
    @customer = Customer.new
    @item = item.new
  end

  def create
    @quote = Quote.new(params[:quote])
    @quote.save
    @customer = Customer.new(params[:customer])
    @customer.save
    @item = Item.new(params[:item])
    @item.save
  end
end

items_controller.rb

class ItemsController < ApplicationController
  def index
  end

  def new
    @item = Item.new
  end

  def create
    @item = Item.new(params[:item])
    @item.save
  end
end

客户控制器.rb

class CustomersController < ApplicationController
  def index
  end

  def new
    @customer = Customer.new
  end

  def create
    @customer = Customer.new(params[:customer])
    @customer.save
  end
end

我的报价单/new.html.erb

<%= form_for @quote do |f| %>
  <%= f.fields_for @customer do |builder| %>
    <%= label_tag :firstname %>
    <%= builder.text_field :firstname %>
    <%= label_tag :lastname %>
    <%= builder.text_field :lastname %>
  <% end %>
  <%= f.fields_for @item do |builder| %>
    <%= label_tag :name %>
    <%= builder.text_field :name %>
    <%= label_tag :description %>
    <%= builder.text_field :description %>
  <% end %>
  <%= label_tag :quote_number %>
  <%= f.text_field :quote_number %>
  <%= f.submit %>
<% end %>

当我尝试提交时出现错误:

Can't mass-assign protected attributes: item, customer

因此,为了尝试修复它,我更新了 quote.rb 中的 attr_accessible 以包含 :item, :customer 但随后出现此错误:

Item(#) expected, got ActiveSupport::HashWithIndifferentAccess(#)

任何帮助将不胜感激。

4

2 回答 2

4

要提交表单及其关联的子项,您需要使用accept_nested_attributes_for

为此,您需要在要使用的控制器的模型中声明它(在您的情况下,它看起来像 Quote Controller.

class Quote < ActiveRecord::Base
  attr_accessible :quote_number
  has_one :customer
  has_one :item
  accepts_nested_attributes_for :customers, :items
end

此外,您需要确保声明哪些属性是可访问的,以避免其他批量分配错误。

于 2013-06-26T22:15:26.133 回答
1

如果您想为不同的模型添加信息,我建议像以下参考一样应用nested_model_form:http ://railscasts.com/episodes/196-nested-model-form-part-1?view=asciicast 。

这个解决方案非常简单和干净。

于 2013-06-26T22:19:47.670 回答