fields_for发送数组而不是Hash(Rails 3)

时间:2010-08-26 04:50:09

标签: ruby-on-rails ruby-on-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

2 个答案:

答案 0 :(得分: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属性),而不是“现在/不存在”,应该使用一个复选框。单选按钮用于互斥选项。

答案 1 :(得分:1)

我最近遇到了同样的问题。我们使用Chrome工具查看params中传递的内容,而不是试图通过控制器获取参数,而是发现我们正在传递空哈希/数组,例如params []与params [:something]