not*_*ton 8 forms ruby-on-rails models
我有3个型号:报价,客户和项目.每个报价都有一个客户和一个项目.当我按下提交按钮时,我想在各自的表中创建一个新报价,一个新客户和一个新项目.我已经查看了其他问题和railscast,要么它们不适用于我的情况,要么我不知道如何实现它们.
quote.rb
class Quote < ActiveRecord::Base
attr_accessible :quote_number
has_one :customer
has_one :item
end
Run Code Online (Sandbox Code Playgroud)
customer.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
Run Code Online (Sandbox Code Playgroud)
item.rb的
class Item < ActiveRecord::Base
attr_accessible :name, :description
#also unsure about this
#each item can also be in multiple quotes
belongs_to :quote
Run Code Online (Sandbox Code Playgroud)
quotes_controller.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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
customers_controller.rb
class CustomersController < ApplicationController
def index
end
def new
@customer = Customer.new
end
def create
@customer = Customer.new(params[:customer])
@customer.save
end
end
Run Code Online (Sandbox Code Playgroud)
我的报价单/ 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 %>
Run Code Online (Sandbox Code Playgroud)
当我尝试提交时,我收到错误:
Can't mass-assign protected attributes: item, customer
Run Code Online (Sandbox Code Playgroud)
所以为了尝试修复它我更新了quote.rb中的attr_accessible以包含:item,:customer但是我得到了这个错误:
Item(#) expected, got ActiveSupport::HashWithIndifferentAccess(#)
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
要提交表单及其关联的子表单,您需要使用accepts_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
Run Code Online (Sandbox Code Playgroud)
此外,您需要确保声明哪些属性是可访问的,以避免其他批量分配错误。
| 归档时间: |
|
| 查看次数: |
10968 次 |
| 最近记录: |