ruby-on-rails – Rails 4中动态表单的未经许可的参数
我是Rails的新手并基于此构建了一些东西
http://railscasts.com/episodes/403-dynamic-forms 但我在其他字段中存储数据时遇到问题… 因此,可以通过构造函数ProductType轻松添加新的动态字段,但是当我尝试通过Product控件在此字段中设置数据时,没有任何反应. 我确信这个问题与使用强参数有关,但修复描述here和here没有帮助. 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 < 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 => []}) 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 P.S:观看播客时可能有人遇到类似的问题? 解决方法
如果要将嵌套哈希作为参数返回,则必须将数组中的键命名为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,{:properties => [:foo,:bar,:id]}) end 如果要动态生成密钥并且无法将它们编码到permit语句中,那么您需要使用以下样式: def product_params params.require(:product).permit(:name,:product_type_id).tap do |whitelisted| whitelisted[:properties] = params[:product][:properties] end end 对于新用户来说,这不是最友好的代码,我刚刚在UW完成了3门课程导轨证书,他们甚至从未覆盖.tap. 这不是我的工作,我仍然只是理解像这样的.permit的深层部分.这是我使用的博客条目:Strong Parameters by Example (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |