Rails 4中动态表单的未允许参数

我是Rails的新手并基于此构建了一些东西

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

但我在附加字段中存储数据时遇到问题…我有一个ProductType对象,它有许多ProductField对象。 ProductField对象也属于ProductType,Product对象属于ProductType。

因此,可以通过构造函数ProductType轻松添加新的动态字段,但是当我尝试通过Product控件在此字段中设置数据时,没有任何反应。

我确信这个问题与使用强参数有关,但是这里描述的修复和这里没有帮助。

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 

在控制台日志中:未允许的参数:属性

 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 

PS:也许有人在观看播客时遇到类似的问题?

如果要将嵌套哈希作为参数返回,则必须将数组中的键命名为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 

如果要动态生成密钥并且无法将它们编码到permit语句中,那么您需要使用以下样式:

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

对于新用户来说,这不是最友好的代码,我刚刚在UW完成了3门课程导轨证书,他们甚至从未覆盖.tap

这不是我的工作,我仍然只是理解像这样的.permit的深层部分。 这是我使用的博客条目: 示例强参数