2010-01-06 1 views
34

배열을 hidden_field에 전달하려고합니다. 내 편집 양식을 제출하면배열을 hidden_field ROR로 전달

다음 사용자는 3 개 역할 [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] 

사용자/edit.html.erb

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

을 가지고, 나는 오류가 발생 : ActiveRecord :: RecordNotFound UsersController # update "ID가 245 인 역할을 찾을 수 없습니다"

어떻게 숨겨진 필드에 배열을 전달할 수 있습니까?

답변

81

나는이 기술을 사용합니다.

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

:multiple 덧붙인다 모두 이상적인 입력 요소의 이름 속성과 multiple="multiple"의 마지막 []. Rails는 배열 입력을 생성 할 때 내부적으로 이것을 사용합니다 (예 : fields_for).

불행히도 잘 설명되어 있지 않습니다. 나는 이것을 고치기 위해 조사 할 것이다.

+3

Rails 4에서 더 이상 작동하지 않는다고 생각합니다. –

+2

이것은 동일한 ID로 입력을 생성하는 레일즈 4에서 작동합니다. – Montas

+2

'hidden_field_tag'과 함께'form_tag'을 사용할 때 Rails 4.0.2에서 작동하지 않습니다. 단지'params [: role_ids]'에서 마지막 역할 만 할 것입니다. 'hidden_field_tag ​​'role_ids []'를 사용하면 잘 동작합니다. –

0

함께 시도 :

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

닫기하지만 여전히 작동하지 않습니다. 필요한 출력 : "role_ids"=> [ "2", "4"]실제 출력 : "role_ids"=> "2, 4" –

2

시도 :

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

해시를 만드는 것 같습니다. 아마도 해킹 할 것입니다. –

+0

새 버전을 사용해보세요. – jamuraa

+0

이것이 끝났습니다. 작업을 마친 것은 ... <% f.fields_for : users do | builder | %> render 'user_fields', : f => 작성자 %> <% end %> THEN <% role = Role.find (: first) %> <% = f.hidden_field : role_ids, : value => 역할을 %% 에 입력하십시오. id %> –

4

내가 여전히 같은 질문이 트레드를 봤 나 같은 사람들을 위해 도움이 될 것이라 생각합니다. 나는 다음 작은 해킹 함께했다 :

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

(숨겨진 필드 'OBJECT_NAME'인수에 반대 괄호에주의). 나를 위해 작동

+3

당신이 아마 이해할 수 있듯이,이 기술은 상당히 비표준 적이기 때문에 이후 버전의 Rails에서 깨질 가능성이 있습니다. – nertzy

12

있는 유일한 방법은 (3.1 레일) hidden_field_tag을 사용하고 있습니다 :

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

user_role_ids [] 주위의 큰 따옴표는 중요합니다. 작은 따옴표는 나를 위해 작동하지 않았다. –

+0

@ MarkRobinson : 이것은 옳지 않을 수 있습니다. –

1

사용하여 레일

4.2.6 내가 사용할 수 있었다

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

:

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

hidden_field_tag 또는 PARAM의 세부 사항에 포함되지 않은 'role_ids[]'를 사용하려고 내 form_params.

이 작동하지 않았다 :

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

을가 렌더링 때문에 :

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

을 컨트롤러 양식 PARAMS 외부로 볼 수 있습니다.