Rails: столбец массива внутри вложенного атрибута params неверное количество аргументов (задано 0, ожидается 1..2) - PullRequest
0 голосов
/ 10 апреля 2020

Не знаю, релевантно ли это, но я использую Cocoon Gem.

Мой основной ресурс для сохранения - это свойство.

Я вложил в это свойство атрибут вызываемый property_unit_attributes

params.require(:property).permit(
 ...
property_units_attributes: [:id, :rent, :floor, :suite_number, :square_feet, :unit_type[], :ceiling_height, :condition, :amenities, :_destroy]
);

Проблема здесь заключается в unit_type, которые являются флажками во вложенной форме, которая принимает эти атрибуты

Я не буду включать всю форму, поскольку все атрибуты сохраняются правильно кроме моего массива. Вот несколько из моих полей-флажков под :unit_type

<div class="field">
        <%= f.check_box :unit_type, { multiple: true, class: 'field__checkbox' }, 'condominium', nil %>
        <label>Condominium</label>
      </div>

      <div class="field">
        <%= f.check_box :unit_type, { multiple: true, class: 'field__checkbox' }, 'general_business', nil %>
        <label>General Business</label>
      </div>

      <div class="field">
        <%= f.check_box :unit_type, { multiple: true, class: 'field__checkbox' }, 'health_care', nil %>
        <label>Health Care</label>
      </div>

      <div class="field">
        <%= f.check_box :unit_type, { multiple: true, class: 'field__checkbox' }, 'hostpitality_or_hotel', nil %>
        <label>Hospitality / Hotel</label>
      </div>

И пример визуализированного HTML:

<div class="field">
   <input class="field__checkbox" type="checkbox" value="land" name="property[property_units_attributes][0][unit_type][]" id="property_property_units_attributes_0_unit_type_land">
   <label>Land</label>
      </div>

Когда я отправляю форму, все атрибуты отображаются в запрос. Я просто расскажу об атрибутах:

"property_units_attributes"=>{"0"=>{"rent"=>"33.0", "floor"=>"33", "suite_number"=>"[FILTERED]", "square_feet"=>"33", "unit_type"=>["condominium", "industrial", "office"], "ceiling_height"=>"33.0", "condition"=>"3", "amenities"=>"3", "id"=>"10"}},

Как видите, я выбрал три флажка, и они помещены в массив:

"unit_type"=>["condominium", "industrial", "office"]

При отправке я получаю эту ошибку: wrong number of arguments (given 0, expected 1..2)

Это происходит, когда я добавляю [] к параметру :unit_type под вложенными атрибутами (см. Выше).

Если я удаляю ее, форма отправляется, но этот столбец не сохраняется.

Я хочу повторить, что все остальные поля сохраняются правильно. Только этот столбец массива полностью его игнорирует.

Если вам нужна дополнительная информация или код из других частей приложения, сообщите мне об этом в комментарии.

1 Ответ

1 голос
/ 10 апреля 2020

Чтобы внести в белый список массив скалярных значений, вы хотите передать ключ ha sh с пустым массивом:

params.require(:property).permit(
 ...
  property_units_attributes: [
      :id, :rent, :floor, :suite_number, 
      :square_feet, :unit_type, :ceiling_height, 
      :condition, :amenities, :_destroy,
      unit_type: []
  ]
)

Этот синтаксис выглядит как темные маги c, но на самом деле он просто old ruby:

irb(main):001:0> [:foo, :bar, baz: 1]
=> [:foo, :bar, {:baz=>1}]

Почему :unit_type[] вызывает "неправильное количество аргументов (задано 0, ожидается 1..2)"?

Если вы пытаетесь :unit_type[0], вы видите, что он вызывает метод доступа в скобках для символа :unit_type.

irb(main):014:0> :unit_type[0]
=> "u"
irb(main):015:0> :unit_type.method("[]")
=> #<Method: Symbol#[](*)>

Если вы хотите объявить символ в скобках или любой другой символ с особым значением Ruby для этого есть специальный синтаксис:

:"unit_type[]" 

Конечно, это не решит проблему здесь, поскольку Rack уже расширяет любые параметры, заканчивающиеся скобками, в массивы и хэши.

...