簡體   English   中英

如何在 Rails 5.2 中允許哈希數組

[英]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

----解決了----

  1. gem 'cancancan' 不允許我使用數組進行創建。
  2. 如果您在允許強參數中存在數組時遇到問題,請嘗試

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) ,它僅適用於單個記錄。

要一次創建一個數組,您應該相應地調整其他相關代碼,例如:

  1. 手動處理數組,如:

     @absenses = params["absences"].map do |raw_absense_params| Absense.create!(raw_absense_params.permit(:user_id, :lesson_id, :excused)) end
  2. 使用accepts_nested_attrubutes_for :absenses為父模型,如果你有任何(可能是Lesson )。 這段代碼會更簡潔,因為 Rails 會為你處理大部分事情,比如由於驗證等原因無法保存所有實例的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM