[英]How to permit array of hashes in Rails 5.2
我試圖通過發布來創建多個“缺席”:
Parameters: {"absences"=>[{"user_id"=>1, "lesson_id"=>25,
"excused"=>true}, {"user_id"=>2, "lesson_id"=>25, "excused"=>true}]}
但是,我無法在控制器中將此格式列入白名單。 我試圖遵循“ 如何在 Rails 中對對象數組使用強參數”中的解決方案。
就我而言:
def absence_params
params.permit(absences: [:user_id, :lesson_id, :excused])
end
我得到
ActiveModel::UnknownAttributeError (unknown attribute 'absences' for Absence.):
然后我嘗試:
Parameters: {"absence"=>[{"user_id"=>1, "lesson_id"=>25,
"excused"=>true}, {"user_id"=>2, "lesson_id"=>25, "excused"=>true}]}
def absence_params
params.permit(:absence, array: [:user_id, :lesson_id, :excused])
end
並得到:
Unpermitted parameters: :absence, :format
----解決了----
params.require(:absences).map do |p|
p.permit(:user_id, :lesson_id, :excused)
end
您的參數許可代碼是正確的:
require "bundler/inline"
gemfile(ENV['INSTALL'] == '1') do
source "https://rubygems.org"
gem "actionpack", "6.0.2.2"
gem "activesupport", "6.0.2.2"
end
require "active_support/core_ext"
require "action_controller/metal/strong_parameters"
require "minitest/autorun"
class BugTest < Minitest::Test
def test_stuff
params = ActionController::Parameters.new({
"absences"=>[
{"user_id"=>1, "unpermitted_param" => 123, "lesson_id"=>25, "excused"=>true},
{"user_id"=>2, "lesson_id"=>25, "excused"=>true}
]
})
assert_equal(
{
"absences"=>[
{"user_id"=>1, "lesson_id"=>25, "excused"=>true},
{"user_id"=>2, "lesson_id"=>25, "excused"=>true}
]
},
params.permit(absences: [:user_id, :lesson_id, :excused]).to_h
)
end
end
錯誤來自其他地方,很可能您正在嘗試執行諸如Absence.create(absence_params)
,它僅適用於單個記錄。
要一次創建一個數組,您應該相應地調整其他相關代碼,例如:
手動處理數組,如:
@absenses = params["absences"].map do |raw_absense_params| Absense.create!(raw_absense_params.permit(:user_id, :lesson_id, :excused)) end
使用accepts_nested_attrubutes_for :absenses
為父模型,如果你有任何(可能是Lesson
)。 這段代碼會更簡潔,因為 Rails 會為你處理大部分事情,比如由於驗證等原因無法保存所有實例的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.