2010-08-26 21 views
11

Tôi đang sử dụng fields_for trong hình thức của tôi như vậyfields_for gửi mảng thay vì Hash (Rails 3)

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

Dưới đây là các nút radio nó tạo ra:

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

Tôi có điều này trong sử dụng .rb

has_many :photos 
    accepts_nested_attributes_for :photos 

Khi gửi biểu mẫu tôi nhận được lỗi này:

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

Có ai biết tại sao điều này xảy ra không?

Btw, tôi đang sử dụng Rails 3.0.0.rc2

Trả lời

2

Bạn đang lưu mô hình của mình như thế nào?

Nếu bạn kiểm tra việc params băm, bạn sẽ nhận được một cái gì đó như:

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

Vì vậy, một User.new(params[:user]).save nên làm việc. Trừ khi bạn đang vượt qua mỗi băm thuộc tính thay vì mảng. Xem this article nếu bạn cần chi tiết hơn.

Có gì trong số băm params của bạn? Điều đó sẽ giúp bạn theo dõi vấn đề.

BTW, nếu bạn muốn có hành vi "đúng/sai" (tôi giả định rằng vì thuộc tính is_public), thay vì "hiện tại/không có mặt", hộp kiểm sẽ được sử dụng. Các nút radio dành cho các tùy chọn loại trừ lẫn nhau.

+0

Lưu xảy ra với tiêu chuẩn '@ user.update_attributes (params [: user])'. Thật không may tôi không thể xem băm params bởi vì nó chết trước khi in đó vào giao diện điều khiển. Tôi giả sử băm params có mảng như bạn đã viết nó mặc dù - vì vậy vẫn không chắc chắn lý do tại sao nó phàn nàn về điều đó. Cảm ơn vì sự trả lời! –

+0

@Brian, bạn có thể thực hiện 'logger.debug (params.inspect)' để kiểm tra. –

+0

Xin chào Andrew, cảm ơn bạn đã phản hồi. Vì vậy, thực sự tôi sẽ đặt dòng đó ở đâu? Nó chết trước khi nhập vào hành động điều khiển của tôi, hoặc application_controller. Đó là một số loại failsafe cho đường ray chết trong khi đầu tiên xử lý yêu cầu để nó không bao giờ thậm chí đi vào bất kỳ mã của tôi. Hoặc là có nơi nào khác để thêm nó? –

1

Gần đây tôi đã gặp phải vấn đề tương tự. Thay vì cố gắng lấy các thông số thông qua bộ điều khiển, chúng tôi đã sử dụng các công cụ Chrome để xem những gì đã được chuyển trong các tham số và nhận thấy rằng chúng tôi đã chuyển một mảng/mảng trống rỗng, ví dụ: params [] so với params [: something]

Các vấn đề liên quan