提案をした人の意見を反映するために、この質問を更新しました。
ブートストラップと単純なフォームを備えたRails3.2アプリでは、請求書モデルに次のものがあります。
has_many :line_items
accepts_nested_attributes_for :line_items
attr_accessible :user_id, :project_name, :date1, :date2, :date3, :paid, :memo, :line_items_attributes
line_itemモデルの場合:
belongs_to :invoice
# validates_presence_of :invoice_id (COMMENTED THESE OUT to generate a clearer error)
# validates_uniqueness_of :invoice_id
私の請求書コントローラーには次のものがあります。
def new
@users = User.find(:all, :order => "username asc")
@line_items = [] # got "undefined method `<<' for nil:NilClass" until defined as array
Product.find(:all, :order => "position asc").each do |p|
@line_items << LineItem.new(:product_id => p.id, :cost => p.unit_cost, :name => p.name, :description => p.description, :position => p.position, :quantity => 0)
end
@invoice = Invoice.new(:line_items_attributes => @line_items) # PRODUCING ERROR
end
私のフォームには次のものがあります。
<%= simple_form_for @invoice do |f| %>
<%= f.input :user_id, :collection => @users.map(&:username) %>
<%= f.input :project_name %>
<%= f.input :date1, :as => :date, :order => [:month, :day, :year], :label => "3rd Invoice" %>
<%= f.simple_fields_for :line_items do |li_fields| %>
<%= li_fields.input :name %>
<%= li_fields.input :quantity %>
<%= li_fields.input :unit_cost %>
<% end %>
<%= f.button :submit, "Save", :class => "btn btn-primary" %>
<% end %>
再び私のコントローラーで:
def create
@invoice = Invoice.new(params[:invoice])
respond_to do |format|
if @invoice.save
...
else
...
end
end
end
エラーメッセージ:
undefined method `with_indifferent_access' for #<LineItem:0x007ffc9ebc0730>
p @line_itemsは次を生成します:
[#<LineItem id: nil, invoice_id: nil, product_id: 5, cost: #<BigDecimal:7ffc9e45d330,'0.69E2',9(18)>, name: "Account", description: "Account", quantity: 0, position: 2, created_at: nil, updated_at: nil>,
#<LineItem id: nil, invoice_id: nil, product_id: 12, cost: #<BigDecimal:7ffc9e45c9f8,'0.3E3',9(18)>, name: "Consultant Training", description: "Consultant Training", quantity: 0, position: 12, created_at: nil, updated_at: nil>]
ご協力いただきありがとうございます。