2010-08-26 3 views
11

Я использую fields_for в моей форме, как такfields_for посылая массив вместо Hash (Rails 3)

<%= 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" /> 
... 

У меня это пользователь .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'): 

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

Btw, я использую Rails 3.0.0.rc2

ответ

2

Как вы экономить свою модель?

Если вы осмотрите params хэш, вы получите что-то вроде:

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

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

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

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

+0

Сохранение происходит со стандартными '@ user.update_attributes (params [: user])'. К сожалению, я не могу просмотреть хэш параметров, потому что он умирает, прежде чем печатать его на консоли. Я предполагаю, что хэш hash имеет такой массив, как вы его написали, - поэтому все еще не уверен, почему он жалуется на это. Спасибо за ответ! –

+0

@Brian, вы можете сделать 'logger.debug (params.inspect)' для проверки. –

+0

Привет, Андрей, спасибо за ответ. Так на самом деле, где бы я положил эту линию? Он умирает до того, как войдет в действие моего контроллера или application_controller. Это какой-то отказоустойчивый для рельсов, который умирает при первой обработке запроса, поэтому он даже не входит ни в один из моих кодов. Или есть где-то еще, чтобы добавить его? –

1

У меня недавно была та же проблема. Вместо того, чтобы пытаться получить параметры через контроллер, мы использовали инструменты Chrome, чтобы увидеть, что передавалось в параметрах, и обнаружили, что мы проходим пустой хэш/массив, например. params [] versus params [: something]