fields_for для отправки массива вместо Hash (Rails 3)

Я использую fields_for в своей форме примерно так

<%= form_for @user %>
  ...
  <%= f.fields_for :photos do |f2| %>
    <%= f2.radio_button :public, 'true' %>
  <% end %>
  ...
<% end %>

Вот переключатели, которые он генерирует:

<input id="user_photos_attributes_0_public_true" name="user[photos_attributes][0][public]" type="radio" value="true" /> 
<input id="user_photos_attributes_0_id" name="user[photos_attributes][0][id]" type="hidden" value="1" /> 

<input id="user_photos_attributes_1_public_true" name="user[photos_attributes][1][public]" type="radio" value="true" /> 
<input id="user_photos_attributes_1_id" name="user[photos_attributes][1][id]" type="hidden" value="4" /> 

<input id="user_photos_attributes_2_public_true" name="user[photos_attributes][2][public]" type="radio" value="true" /> 
<input id="user_photos_attributes_2_id" name="user[photos_attributes][2][id]" type="hidden" value="5" />
...

У меня есть это в user.rb

  has_many :photos
  accepts_nested_attributes_for :photos

Когда форма Я получаю эту ошибку:

Error during failsafe response: ActionView::Template::Error
TypeError (expected Hash (got Array) for param `photos_attributes'):

Кто-нибудь знает, почему это происходит?

Кстати, я использую Rails 3.0.0.rc2

11
задан Brian Armstrong 26 August 2010 в 04:50
поделиться

1 ответ

Как вы сохраняете свою модель?

Если вы проверяете params, вы получите что-то вроде:

{ :user => {:photo_attributes => [{:id => 1, :public => true}, {:id => 4, :public => false}] }, :your_other_params => ... }}

Так что User.new(params[:user]).save должен работать. Если вы не передаете каждый хэш атрибутов вместо массива. См. эту статью, если вам нужна более подробная информация.

Что находится в вашем хэше params? Это поможет вам отследить проблему.

Кстати, если вам нужно поведение «истина/ложь» (я предполагаю, что из-за свойства is_public), а не «присутствует/отсутствует», следует использовать флажок. Радиокнопки предназначены для взаимоисключающих вариантов.

2
ответ дан 3 December 2019 в 12:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: