Rails 3.2 a_de nombreux processus de soumission de formulaire

J’ai un has_many: via le formulaire où je ne peux pas obtenir un atsortingbut supplémentaire pour poster dans la firebase database. J’encrasse le nom du paramètre quelque part. Je peux obtenir les clés étrangères pour publier, mais j’ai un autre atsortingbut que j’essaie de suivre dans la table de jointure. Gardez à l’esprit qu’il s’agit d’un formulaire 100% ajax. Voici ce que je sais

Edit: Après des recherches sur des problèmes similaires, je comprends que je suis censé créer les atsortingbuts de formulaire, mais le code que j’ai trouvé ne fonctionne pas pour une raison quelconque. Voici quelques ressources.

http://railsforum.com/viewtopic.php?id=20203

Rails 3, formulaires multi-niveaux nesteds et has_any

Ce que je ne comprends pas, c’est que la fixation des product_ids est intégrée aux rails. Ces valeurs post. Pourquoi est-il difficile d’attacher l’atsortingbut quantity_shipped à ce tableau?

Models and Relationships Shipment has_many :products :through => :product_shipments Product has_many :shipments :through => :product_shipments ProductShipments belongs_to :shipment, belongs_to :product ProductShipments table t.integer :shipment_id t.integer :product_id t.integer :qty_shipped <-- This is the Problem Child 

Ce partiel est bouclé plusieurs fois et affiche tous les produits d’un fournisseur donné. Il génère un tableau pour les product_ids et un autre pour les quantités product_shipments.

_product_shipments.html.erb.

 

Assign Products to Ship

    product.id do %> <--This is where the issue lies

Ce sont les données POST pertinentes lorsque le formulaire est soumis.

 "product_ids"=>["1", "3"]}, "product_shipments"=>{"qty_shipped"=>["32", "23"]} 

C’est SQL qui est envoyé à la firebase database

 INSERT INTO `product_shipments` (`product_id`, `qty_shipped`, `shipment_id`) VALUES (1, NULL, 155) INSERT INTO `product_shipments` (`product_id`, `qty_shipped`, `shipment_id`) VALUES (3, NULL, 155) 

Voici l’action dans mon contrôleur

 def create @shipment = Shipment.new(params[:shipment]) @product_shipments = @shipment.product_shipments.build(params[:product_shipments]) 

[: qty_shipped]) shipments_url else flash [: notice] = “Non enregistré” end end

Voici le dernier problème que j’ai.

 TypeError (can't convert Symbol into Integer): app/controllers/shipments_controller.rb:24:in `[]' app/controllers/shipments_controller.rb:24:in `create' 

JE L’AI. Après avoir apporté les modifications avec la bonne réponse ci-dessous. J’ai pu corriger le contrôleur à la suivante

 @product_shipments = @shipment.product_shipments.build(params[:product_shipments]) 

La solution la plus simple est de générer un tableau de hachages ressemblant à

 :product_shipments=>[{:product_id=>1, :qty_shipped=>32},{:product_id=>3, :qty_shipped=>23}] 

au lieu de deux jeux de hachages :shipment=>{:product_ids=>[1,3]} et :product_shipments=>[:qty_shipped=>[32,23]] .

Pour ce faire, modifiez votre code d’affichage en

 <%= hidden_field_tag("product_shipments[][product_id]", product.id) %> <%= product.product_name %><%= text_field_tag("product_shipments[][qty_shipped]")%> 

Ensuite, votre action de contrôleur devrait fonctionner telle quelle.

Votre action “créer” peut être aussi simple que

 def create @shipment = Shipment.new(params[:shipment]) if @shipment.save # success else # failure end end 

si vous utilisez des atsortingbuts nesteds pour créer shipping_products via le nouvel enregistrement d’envoi. Pour ce faire, ajoutez ce qui suit au modèle d’envoi.

 class Shipment attr_accessible :shipment_products_atsortingbutes accepts_nested_atsortingbutes_for :shipment_products end 

En utilisant fields_for dans la vue, cela permettra à un envoi d’accepter les params[:shipment][:shipment_products_atsortingbutes] et de les transmettre à ses expeditions_produits.

Dans votre nouvelle action, vous pourriez faire quelque chose comme

 def new @shipment = Shipment.new # collect the ids of the products you want to create shipment products for @shipment.shipment_products.build([{:product_id=> ...},{:product_id=> ...}, ...]) end 

afin que sous la forme que vous puissiez faire quelque chose comme

 <%= form_for @shipment, :remote => true do |f|%> ... ... 
    <%= f.fields_for :shipment_products do |sp_f| %>
  • <%= sp_f.text_field :qty_shipped %> <%= sp_f.hidden_field :product_id %>
  • <% end %>
<% end %>