Search code examples
ruby-on-railsrubyruby-on-rails-2

Can't save the id from other table in relationship


I created a form view to save the id from other table but is not working and saving NULL.

Here my tables:

|purchase_products|
  |id| |name|       #A.I (AUTO INCREMENT IN 1)
   A.I   varchar(255)
    1    ABC
    2    DEF

|supplier_products|     
  |id|  |purchase_product|  |amount|
   A.I      integer          integer
    1        2                1000
    2        1                2000  

Here is the controller:

class PurchaseProductController < ApplicationController

   def new_product
     @obj_product = PurchaseProduct.new(params[:obj_product])
     @obj_supplier_product = SupplierProduct.new(params[:obj_supplier_product])
   end

   def create_product
     @obj_product = PurchaseProduct.new(params[:obj_product])
     @obj_supplier_product = SupplierProduct.new(params[:obj_supplier_product])

     if @obj_product.save()
        @obj_supplier_product.save()
     end
   end
end

Here my models:

class PurchaseProduct < ActiveRecord::Base
   has_many :supplier_products 
end

class SupplierProduct < ActiveRecord::Base
   belongs_to :purchase_product
end

Here is my view

<% form_for :obj_product, :url => {:controller=>"purchase_product",:action=>'create_product'}  do |f|%>
  Amount:<%= text_field_tag 'obj_product[name]',@name %>
   ID    <%= text_field_tag 'obj_supplier_product[id]',@obj_product.id %>
  <%= submit_tag "Create",:class=>"button" %> 
<% end %>

Here is the log:

Processing PurchaseProductController#create_product (for 127.0.0.1 at 2014-07-23 15:56:48) [POST]
Parameters: {"obj_supplier_product"=>{"purchase_product_id"=>"", "amount"=>"1800", "supplier_id"=>"6"}, "obj_product"=>{"name"=>"Impresora "}, "authenticity_token"=>"yeah", "commit"=>"Create"}
PurchaseProduct Create (0.2ms)   INSERT INTO `purchase_products` (`name`) VALUES( 'Printer' )
SQL (29.9ms)   COMMIT
SQL (0.1ms)   BEGIN
SupplierProduct Create (0.0ms)   Mysql::Error: Column 'purchase_product_id' cannot be null:
INSERT INTO `supplier_products` (`purchase_product_id`, `amount`) VALUES(NULL, 1800.0)

The ID from purchase_products is not saving in supplier_products

I tried and still not working:

   def create_product
     @obj_product = PurchaseProduct.new(params[:obj_product])
     @obj_supplier_product = SupplierProduct.new(params[:obj_supplier_product])

     if @obj_product.save()
        @obj_product.id= @obj_supplier_product.purchase_product_id   
        @obj_supplier_product.save()
     end
   end

Please somebody can help me?


Solution

  • The easy way: in your controller change your save logic for this:

    if @obj_product.save
      @obj_supplier_product.purchase_product_id = @obj_product.id
      @obj_supplier_product.save
    end
    

    The correct way: Use nested attributes: http://railscasts.com/episodes/196-nested-model-form-part-1