Как разрешить массив хэшей в Rails 5.2 - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь создать несколько сообщений об отсутствии, отправив сообщение:

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. гем 'cancancan' не разрешал мне создавать с использованием массива.
  2. Если у вас есть проблема с разрешением массива в сильных параметрах, попробуйте

params.require(:absences).map do |p|
  p.permit(:user_id, :lesson_id, :excused)
end

1 Ответ

2 голосов
/ 23 марта 2020

Ваш код разрешения параметров правильный:

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 будет обрабатывать большинство вещей за вас, например, случаи, когда не все экземпляры могут быть сохранены из-за проверки, et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...