我正在研究一個帶有名為 element 的 atter_accessor 物件的模型。我想將表單資料陣列傳遞給元素物件。在 Rails 控制臺中,我收到 Unpermitted parameter 錯誤。
Parameters: {"authenticity_token"=>"[FILTERED]", "category"=>{"name"=>"asfd", "body"=>"asf", "element"=>{"1"=>"asfd:text", "2"=>"asfd:text", "3"=>"asfd:text"}}, "type"=>"text", "commit"=>"Create Category"}
Unpermitted parameter: :element. Context: { controller: CategoriesController, action: create, request: #<ActionDispatch::Request:0x0000000106b3ff68>, params: {"authenticity_token"=>"[FILTERED]", "category"=>{"name"=>"asfd", "body"=>"asf", "element"=>{"1"=>"asfd:text", "2"=>"asfd:text", "3"=>"asfd:text"}}, "type"=>"text", "commit"=>"Create Category", "controller"=>"categories", "action"=>"create"} }
在模型中 attr_accessor :elements
在控制器中
def category_params
params.require(:category).permit(:name, :body, :elements => [])
end
我嘗試了許多替代方法,也將其更改:elements為element: [],但沒有任何效果。我想我在這里遺漏了一些東西,這就是我得到一個未經許可的引數的原因。
uj5u.com熱心網友回復:
element除了/命名問題之外,這里還有很多混亂elements- 選擇一個并堅持下去。
如果要在 Rack 應用程式中將陣列作為 FormData 傳遞,則需要使用帶空括號的鍵:
irb(main):001:0> str = "elements[]=a&elements[]=b&elements[]=c" => "elements[]=a&elements[]=b&elements[]=b"
irb(main):002:0> Rack::Utils.parse_nested_query(str)
=> {"elements"=>["a", "b", "c"]}
如果您在括號中放置任何型別的值,它將被決議為哈希值:
irb(main):003:0> str = "elements[1]=a&elements[2]=b&elements[3]=c"
=> "elements[1]=a&elements[2]=b&elements[3]=b"
irb(main):004:0> Rack::Utils.parse_nested_query(str)
=> {"elements"=>{"1"=>"a", "2"=>"b", "3"=>"c"}}
當將一個空陣列列入白名單時,將允許一個允許的標量值陣列:
irb(main):005:0> params = ActionController::Parameters.new(Rack::Utils.parse_nested_query("elements[]=a&elements[]=b&elements[]=b"))
=> #<ActionController::Parameters {"elements"=>["a", "b", "b"]} permitted: false>
irb(main):006:0> params.permit(elements: [])
=> #<ActionController::Parameters {"elements"=>["a", "b", "b"]} permitted: true>
將哈希列入白名單時,您傳遞一個符號陣列,這些符號代表您要允許的鍵:
irb(main):006:0> params = ActionController::Parameters.new(foo: { bar: 1, baz: 2, woo: 3 })
irb(main):007:0> params.permit(foo: [:bar, :baz])
=> #<ActionController::Parameters {"foo"=>#<ActionController::Parameters {"bar"=>1, "baz"=>2} permitted: true>} permitted: true>
您還可以通過傳遞空哈希來允許具有任意鍵的哈希:
irb(main):008:0> params.permit(foo: {})
=> #<ActionController::Parameters {"foo"=>#<ActionController::Parameters {"bar"=>1, "baz"=>2, "woo"=>3} permitted: true>} permitted: true>
這是一個有點危險的操作,應該小心操作。
uj5u.com熱心網友回復:
您沒有提到您正在使用的 rails 版本,但是
:elements => []由于 elements 是 ruby?? 哈希而不是陣列,因此不起作用
在 Rails 5.1 上你可以使用
params.require(:category).permit(:name, :body, :elements => {})
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/428362.html
