2010-01-06 30 views
34

Tôi đang cố chuyển một mảng vào một trường dữ liệu ẩn.Truyền một mảng vào trong hide_field ROR

Những thành viên sau đây có 3 vai trò [2,4,5]

>> u = User.find_by_login("lesa") 
=> #<User id: 5, login: "lesa", email: "[email protected]", crypted_password: "0f2776e68f1054a2678ad69a3b28e35ad9f42078", salt: "f02ef9e00d16f1b9f82dfcc488fdf96bf5aab4a8", created_at: "2009-12-29 15:15:51", updated_at: "2010-01-06 06:27:16", remember_token: nil, remember_token_expires_at: nil> 
>> u.roles.map(&:id) 
=> [2, 4, 5] 

Users/edit.html.erb

<% form_for @user do |f| -%> 
<%= f.hidden_field :role_ids, :value => @user.roles.map(&:id) %> 

Khi tôi nộp chỉnh sửa hình thức của tôi, tôi nhận được một lỗi: ActiveRecord :: RecordNotFound in UsersController # update "Không thể tìm thấy Vai trò có ID = 245"

Làm cách nào để chuyển mảng vào trong trường hidden_field?

Trả lời

81

Tôi sẽ sử dụng kỹ thuật này.

<% @user.roles.each do |role| %> 
    <%= f.hidden_field :role_ids, :multiple => true, :value => role.id %> 
<% end %> 

:multiple thêm cả [] đến hết thuộc tính tên và multiple="multiple" đến các yếu tố đầu vào, đó là lý tưởng. Rails sử dụng nội bộ này khi nó tạo đầu vào cho mảng, chẳng hạn như trong fields_for.

Thật không may là nó không được ghi chép đầy đủ. Tôi sẽ xem xét sửa lỗi này.

+3

Tôi không tin rằng điều này hoạt động nữa trong Rails 4 –

+2

Điều này làm việc trong Rails 4 altho nó tạo ra đầu vào với cùng một id. – Montas

+2

Không hoạt động với tôi trong Rails 4.0.2 khi sử dụng 'form_tag' với' hidden_field_tag', tôi sẽ chỉ nhận vai trò cuối cùng trong 'params [: role_ids]'. Sử dụng 'hidden_field_tag ​​'role_ids []'' hoạt động tốt. –

0

thử với:

<%= f.hidden_field :role_ids, :value => @user.roles.map(&:id).join(", ") %> 
+0

Đóng nhưng vẫn không hoạt động. Đầu ra yêu cầu: "role_ids" => ["2", "4"] Đầu ra thực tế: "role_ids" => "2, 4" –

2

Hãy thử:

<% @user.roles.each_with_index do |role| %> 
    <%= f.hidden_field "role_ids[]", :value => role.id %> 
<% end %> 
+0

có vẻ như tạo băm - có lẽ tôi sẽ xung đột với nó. –

+0

thử phiên bản mới? – jamuraa

+0

Điều này sắp kết thúc, Điều gì đã kết thúc làm việc là ... <% f.fields_for: người dùng làm | người xây dựng | %> <% = hiển thị 'user_fields',: f => builder%> <% end %> THÌ <% role = Role.find (: đầu tiên)%> <% = f.hidden_field: role_ids,: value => role. id%> –

4

Tôi nghĩ rằng nó vẫn sẽ rất hữu ích cho những người như tôi, người googled tread này đặt ra câu hỏi tương tự. Tôi đã đưa ra một chút hack nhỏ tiếp theo:

<%= f.hidden_field "role_ids][", { :id => "role_ids", :value => [] } %> 

(chú ý đến dấu ngoặc ngược trong đối số 'object_name' cho trường ẩn).

+3

Như bạn có thể hiểu, có khả năng là kỹ thuật này sẽ phá vỡ trong phiên bản sau của Rails vì nó khá không chuẩn. – nertzy

12

Điều duy nhất làm việc cho tôi (Rails 3.1) đang sử dụng hidden_field_tag:

<% @users.roles.each do |role| %> 
    <%= hidden_field_tag "user_role_ids[]", role.id %> 
<% end %> 
+0

Dấu ngoặc kép xung quanh user_role_ids [] là quan trọng. Dấu nháy đơn không hiệu quả với tôi. –

+0

@MarkRobinson: điều này không thể đúng. –

1

sử dụng Rails 4.2.6

tôi đã có thể sử dụng

<% @user.roles.each do |role| 
    <%= f.hidden_field :role_ids, :id => role.id, :value => role.id, :multiple => true %> 
<% end %> 

mà hiển thị:

<input id="12345" value="12345" multiple="multiple" type="hidden" name="role_form[role_ids][]"> 

cố gắng sử dụng hidden_field_tag hoặc 'role_ids[]' các chi tiết param không được bao gồm trong số form_params của tôi.

này đã không làm việc:

<% @user.roles.each do |role| 
    <%= hidden_field_tag 'role_ids[]', role %> 
<% end %> 

vì nó ám:

<input type="hidden" name="role_ids[]" id="role_ids_" value="12345"> 

và được xem bởi bộ điều khiển ngoài của params mẫu.

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