2017-02-20 3 views
0

그래서 나는 이런 종류의 연관이 체크 박스 필드 통해 form_for PARAMS :레일. Has_many :

class FirstModel 
has_many :merged_models 
has_many :second_models, :through => :merged_models 
end 

class SecondModel 
has_many :merged_models 
has_many :first_models, :through => :merged_models 
end 

class MergedModel 
belongs_to :first_model 
belongs_to :second_model 
end 

이제 내 문제는 도우미에 전달 된 컬렉션 HTML의 요소를 인식하는 데 도움이 트릭을 이해하는 것입니다 내 형태 :

first_model.second_models.include?(s), :name => 'first_model[second_model_ids][]' 

:

form_for(first_model) do |f| 

    <% SecondModel.all.each do |s| -%> 
    <div> 
     <%= check_box_tag 'second_model_ids[]', s.id, first_model.second_models.include?(s), :name => 'first_model[second_model_ids][]'-%> 
     <%= label_tag :second_model_ids, s.first_name -%> 
    </div> 
    <% end -%> 

내가 이해하지 못하는 것은 이것이다 나는 생각이 그 : SecondModel의 객체 ID가 FirstModel의 second_model_ids 배열에 이미있는 경우

first_model.second_models.include?(s) 

확인합니다. 그 :name에서 온

:name => 'first_model[second_model_ids][]' 

이 ID가

는 그리고이 부분은 나를 더욱 혼란하게

않는 등의 것을 다음이있는 경우 -이 경우에는 내가 문이 경우 같은 것을 기대? first_model[second_model_ids][]에 두 개의 대괄호가있는 이유 - 레일스 구문에서 어떻게 작동합니까? 이 새로 검사 한 ID를 second_model_ids 배열에 병합 하시겠습니까?

모든 정보를 제공합니다. 감사! 귀하의 경우

check_box_tag(name, value = "1", checked = false, options = {}) 

:

check_box_tag 'second_model_ids[]', s.id, first_model.second_models.include?(s), :name => 'first_model[second_model_ids][]' 

첫번째 파라미터 (이름) 'second_model_ids는 [], 이것은 ID = 일부로 사용될 것이다

답변

1

그래서 check_box_tag이 서명을 가진다 태그의 체크 박스의 두 번째 매개 변수 (값)는 s의 ID (SecondModel의 현재 인스턴스)입니다. 세 번째 매개 변수 (확인)입니다 :에 '만약'

first_model.second_models.include?(s) 

당신은 의미에 대한 권리, 그리고 당신은 필요가 없습니다. include?()는 (물음표로 끝나는 대부분의 Ruby 메소드와 마찬가지로) 부울을 반환합니다. 당신은 IRB이나 레일 콘솔이 시도 할 수 있습니다 :

[1,2,3].include?(2) 
# => true 

마지막 옵션 : HTML로 사용되는 옵션의 해시에

:name => 'first_model[second_model_ids][]' 

패스. 이 경우 키 : name을 가진 단일 해시 값 (위의 첫 번째 매개 변수와 혼동하지 말고 html 태그에서 id = '...'로 사용됨)은 태그에서 직접 사용됩니다.

name='first_model[second_model_ids][]' 

여기에도 구문에 대한 내용이 적절합니다. 괄호는 Rails가 params 해시를 올바른 중첩으로 구문 분석하는 데 도움이됩니다.

first_model: {foo: 1, bar: 2, second_model: {some: stuff, other: stuff}}