Parámetros no permitidos para Dynamic Forms en Rails 4

Soy nuevo en Rails y construí algo basado en esto

http://railscasts.com/episodes/403-dynamic-forms

pero tengo un problema con el almacenamiento de datos en los campos adicionales … Tengo un objeto ProductType que tiene muchos objetos ProductField. El objeto ProductField también pertenece a un ProductType y un objeto Product pertenece a un ProductType.

Por lo tanto, los nuevos campos dynamics se pueden agregar fácilmente a través del tipo de producto del constructor, pero cuando bash configurar los datos en este campo a través del controlador del producto, no sucede nada.

Estoy seguro de que el problema está relacionado con el uso de parámetros sólidos, pero la solución descrita aquí y aquí no ayudó.

product.rb

class Product < ActiveRecord::Base belongs_to :product_type serialize :properties, Hash end 

product_type.rb

 class ProductType < ActiveRecord::Base has_many :fields, class_name: "ProductField" accepts_nested_attributes_for :fields, allow_destroy: true end 

product_field.rb

 class ProductField < ActiveRecord::Base belongs_to :product_type end 

products_controller.rb

 class ProductsController  []}) end 

product_type_controller.rb

 class ProductTypesController < ApplicationController def product_type_params params.require(:product_type).permit(:name, fields_attributes: [:id, :name, :field_type, :required, :product_type_id]) end 

En el registro de la consola: Parámetros no permitidos: propiedades

 Started PATCH "/products/4" for 127.0.0.1 at 2013-10-04 22:54:59 +0400 Processing by ProductsController#update as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"my3ra60OUXexmmguk2eqRetizx3tWPMq04Z2PnODJMQ=", "product"=>{"product_type_id"=>"1", "name"=>"Product1", "properties"=>{"gjfghjf"=>"123", "123"=>[""]}, "price"=>"10"}, "commit"=>"Update Product", "id"=>"4"} Product Load (0.3ms) SELECT "products".* FROM "products" WHERE "products"."id" = ? LIMIT 1 [["id", "4"]] Unpermitted parameters: properties 

PD: ¿tal vez alguien enfrentó un problema similar al ver un podcast?

Si desea devolver un hash nested como parámetro, debe asignar un nombre a las claves de la matriz en permit .

 class ProductsController < ApplicationController def new @product = Product.new(product_type_id: params[:product_type_id]) end def product_params params.require(:product).permit(:name, :price, :product_type_id, {:properties => [:foo, :bar, :id]}) end 

Si está generando las claves dinámicamente y no puede codificarlas en la statement de permit , entonces necesita usar este estilo:

 def product_params params.require(:product).permit(:name, :price, :product_type_id).tap do |whitelisted| whitelisted[:properties] = params[:product][:properties] end end 

No es el código más amigable para un nuevo usuario, acabo de terminar el certificado de 3 vías de Rails en UW y nunca cubrieron .tap .

Este no es mi trabajo, todavía estoy comprendiendo las partes más profundas de .permit esta manera. Esta es la entrada de blog que utilicé: Parámetros fuertes por ejemplo