2013-05-12 52 views
0

我似乎有通过我的连接表接收产品的问题,它给我一个奇怪的错误,因为它似乎没有收到我的订单ID。我只能假设这是因为订单还没有创建,但我在这一步创建订单,所以订单还没有ID。所以这是我的问题。Rails:接收嵌套表单的问题有很多通过加入

这是我收到的错误:

ActiveRecord::RecordNotFound in OrdersController#create 

Couldn't find Product with ID=1 for Order with ID= 

Rails.root: /BillingSystem 
Application Trace | Framework Trace | Full Trace 

app/controllers/orders_controller.rb:10:in `new' 
app/controllers/orders_controller.rb:10:in `create' 

Request 

Parameters: 

{"utf8"=>"✓", 
"authenticity_token"=>"jE2wdERoxE7PKwBhN60KAfguxwAq8qdW4wbru51SMFg=", 
"order"=>{"client_id"=>"1", 
"products_attributes"=>{"1368396234677"=>{"id"=>"1", 
"_destroy"=>"false"}}}, 
"commit"=>"Create Order"} 

Show session dump 

Show env dump 
Response 

Headers: 

None 

新秩序观:

<% if current_user %> 
    <div id="dashboard"> 
     <div id="logo"></div> 
     <table id="go_back_link_container"> 
      <tr> 
       <td> 
        <div class="go_back_link"> 
         <%= link_to "<- Go Back", "/orders/view" %> 
        </div> 
       </td> 
       <td> 
        <div id="user_display"> 
         Logged in as <%= current_user.email %>. 
         <%= link_to "Log out", log_out_path %> 
        </div> 
       </td> 
      </tr> 
     </table> 
     <%= form_for @order, method: :post do |f| %> 
      <% if @order.errors.any? %> 
       <div class="error_messages"> 
        <% for message in @order.errors.full_messages %> 
         * <%= message %> <br> 
        <% end %> 
       </div> 
      <% end %> 
      <p> 
       <%= f.label 'Select The Client' %><br /> 
       <%= select :order, :client_id, Client.all().collect { |c| [ (c.firstname + " " + c.surname), c.id ] } %> 
      </p> 

      <%= f.fields_for :products do |pf| %> 
       <% #render 'product_fields', f: builder %> 
      <% end %> 
      <%= link_to_add_fields "Add Product", f, :products %> 

      <p class="button"><%= f.submit %></p> 
     <% end %> 
     <% flash.each do |name, msg| %> 
      <%= content_tag :div, "* " + msg, :id => "flash_#{name}" %><br /> 
     <% end %> 
     <div id="copyright-notice"><div id="copyright_border">Copyright © Conner McCabe, all rights reserved.</div></div> 
    </div> 
<% else %> 
    <script type="text/javascript"> 
     window.location="<%= root_url %>" 
    </script> 
<% end %> 

订货型号:

class Order < ActiveRecord::Base 
    has_many :orderedproducts 
    has_many :products, through: :orderedproducts 
    has_one :client 

    attr_accessible :client_id, :order_total, :delivery_date, :products, :products_attributes 

    accepts_nested_attributes_for :products, :allow_destroy => true 

    before_save :generate_total 

    def generate_total 
     self.order_total = self.products.map(&:product_price).sum 
    end 
end 

订单控制器:

class OrdersController < ApplicationController 
    def view 
     @orders = Order.all 
    end 

    def new 
     @order = Order.new 
    end 
    def create 
     @order = Order.new(params[:order]) 
     if @order.save 
      redirect_to '/orders/view', :notice => "Order Created!" 
     else 
      render "new" 
     end 
    end 
end 

产品领域的部分:

<fieldset> 
    <%= f.select :id, Product.all().collect {|p| [ p.product_name, p.id ] } %> 

    <%= f.hidden_field :_destroy %> 
    <%= link_to "remove", '#', class: "remove_fields" %> 
</fieldset> 

产品型号:

class Product < ActiveRecord::Base 
    #This line makes these elements accessible outside of the class. 
    attr_accessible :product_name, :product_price, :product_quantity, :product_supplier 

    has_many :orderedproducts 
    has_many :orders, through: :orderedproducts 

    #These attributes ensure that the data entered for each element is valid and present. 
    validates_presence_of :product_name 
    validates_presence_of :product_price 
    validates_numericality_of :product_price 
    validates_presence_of :product_quantity 
    validates_numericality_of :product_quantity 
    validates_presence_of :product_supplier 

end 

应用助手:

module ApplicationHelper 
    def link_to_add_fields(name, f, association) 
    new_object = f.object.send(association).klass.new 
    id = new_object.object_id 
    fields = f.fields_for(association, new_object, child_index: id) do |builder| 
     render(association.to_s.singularize + "_fields", f: builder) 
    end 
    link_to(name, '#', class: "add_fields", data: {id: id, fields: fields.gsub("\n", "")}) 
    end 
end 

有序产品型号:

class Orderedproduct < ActiveRecord::Base 
    attr_accessible :order_id, :product_id, :quantity_ordered 
    belongs_to :order 
    belongs_to :product 
end 

我公顷我列出了可能包含错误的所有可能的文件,我知道这有点过分,但它是与它有关的所有事情,并且更好地包含它而不是完全包含它。

我也遵循这个railscast指南:http://railscasts.com/episodes/196-nested-model-form-revised 为了到达我所在的位置,我稍微编辑了它,以便它适合我的应用程序。

在此先感谢。

回答

1

我们对一个项目有类似的问题,除非关系是单数。问题是ActiveRecord正在寻找一个现有的关联;像order.products.find(1)一样。由于订单是新记录,所以这是行不通的。

您可以创建自己的products_attributes =方法并定义正确的行为。但我认为你可以为连接模型(Orderedproduct)而不是Product使用嵌套属性。

class Order 
    accepts_nested_attributes_for :orderedproducts 
end 

然后适当调整表单域。在新的形式

f.fields_for :products do |pf|变得f.fields_for :orderedproducts do |pf|

在局部

<%= f.select :id, Product.all().collect {|p| [ p.product_name, p.id ] } %>领域变得<%= f.select :product_id, Product.all().collect {|p| [ p.product_name, p.id ] } %>