0

我在 Rails 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 方法(我在项目的另一部分中使用过)进行了修改,但这似乎不适用于选择框。任何帮助,将不胜感激。谢谢。

4

1 回答 1

1

您可以尝试将 中的site_id作为参数传递URL给 AJAX 调用,然后在controller. 在该controller方法中,您还可以获取该departments特定对象的列表,site然后将其传递给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 %>
于 2012-05-10T23:42:19.973 回答