0

회사에 사용자를 생성하기위한 양식이 레일스 3.2에 있습니다. 각 회사에는 사이트가 있습니다. 사이트는 collection_select를 통해 사용자에게 할당되고 각 사이트에는 확인란을 사용하여 선택된 여러 부서가 있습니다. 사용자는 사이트에 속하며 해당 사이트의 여러 부서에 속할 수 있습니다.레일스 3.2 양식의 collection_select 값에 따라 확인란의 옵션을 변경할 수 없습니다.

사이트 collection_select에서 선택한 값에 따라 종속을 변경하려면 부서 확인란 옵션이 필요합니다.

나는 collection_select를 사용하여 부서를 포함하는 부분을 호출하기 위해 onchange를 사용하여이 작업을 수행하려고 시도해 왔습니다. 나는이 일을 할 수 있었지만 회사의 모든 부서 만 표시했습니다. 각 개별 사이트의 부서가 아닙니다. 선택한 사이트를 부분으로 전달하여 올바른 부서를 반환 할 수 있는지 이해할 수 없습니다 (가능한 경우).

내 코드는 지금까지 있습니다 :

형태 :

<%= form_for @user, :url => front_admin_users_path do |f| %> 
     <%= devise_error_messages! %> 

     <div><%= f.label :email %><br /> 
     <%= f.email_field :email %></div> 

     <%= f.collection_select :role, User::ROLES, :to_s, :humanize %> 

     <%= f.collection_select :site_id, current_user.company.sites.all, :id, :name, {}, :onchange => "jQuery.get('/load_department')", :remote => true %> 

     <div id="department_frame"></div> 

     <div><%= f.label :password %><br /> 
     <%= f.password_field :password %></div> 

     <div><%= f.label :password_confirmation %><br /> 
     <%= f.password_field :password_confirmation %></div> 

     <div><%= f.submit "Sign up" %></div> 
    <% end %> 

users_controller.rb :

 def load_department 
     respond_to do | format | 
     format.js {render :layout => false} 
     end 
    end 

load_department.js.erb :

$("#department_frame").html("<%=j render(:partial =>"department") %>"); 

_department.html .erb :

<% current_user.company.sites.each do |site| %> 
<% for department in site.departments %> 
    <%= check_box_tag "user[department_ids][]", department.id, current_user.department_ids.include?(department.id) %> 
    <%= department.name %> 
<% end %> 

나는 해결책을 찾기 위해 노력하고 일 동안 검색 좀했지만 정확히 내가 원하는 것을 찾을 수 있습니다. 내가 찾은 가장 가까운 것은 라이언 베이트 (Ryan Bate)의 다이내믹 콜렉션이 grouped_collection_select 메소드 (프로젝트의 다른 부분에서 사용 했음)를 사용하여 개정 된 것을 선택하는 것이지만, 이것은 선택 상자를 다루지 않는 것 같습니다. 어떤 도움을 주시면 감사하겠습니다. 감사.

답변

1

URL의 매개 변수로 site_id을 AJAX 호출로 전달한 다음 controller에서 해당 값을 읽을 수 있습니다. controller 메서드에서 해당 site에 대한 departments의 목록을 가져온 다음 렌더링중인 view으로 전달할 수 있습니다.

내가 코드가 의미하는 바를 설명하기 위해 코드의 관련 부분을 편집했습니다. 희망이 있습니다 의미 :

양식

<%= f.collection_select :site_id, current_user.company.sites.all, :id, :name, {}, :onchange => "jQuery.get('/load_department?site=' + $('#user_site_id').val())", :remote => true %> 

users_controller.rb :

def load_department 
    site = params[:site] 
    @departments = Site.find(site).departments 

    respond_to do | format | 
     format.js {render :layout => false} 
    end 
end 

_department.html.erb :

<% for department in @departments %> 
     <%= check_box_tag "user[department_ids][]", department.id, current_user.department_ids.include?(department.id) %> 
     <%= department.name %> 
    <% end %>