根据rails 3.2表单中的collection_select的值,无法获取要更改的复选框选项

时间:2012-05-10 20:11:13

标签: ruby-on-rails ruby-on-rails-3 partial-views ruby-on-rails-3.2 rails-3.1

我在rails 3.2中有一个用于在公司中创建用户的表单。每家公司都有网站。通过collection_select将站点分配给用户,然后每个站点都有许多使用复选框选择的部门。用户属于某个站点,可以属于该站点的许多部门。

我需要部门复选框选项,以根据网站collection_select中的选定值进行更改。

我一直试图通过使用:onchange of collection_select来调用包含部门的部分。我设法让这个工作,但只显示公司的所有部门。不是每个站点的部门。我不明白如何将选定的网站传递给部分,以便它可以返回正确的部门(如果可能的话)。

到目前为止我的代码是:

形式:

    <%= 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 个答案:

答案 0 :(得分:1)

您可以尝试将site_id作为URL中的参数传递给AJAX调用,然后在controller中读取该值。在controller方法中,您还可以获取该特定departments的{​​{1}}列表,然后将其传递给正在呈现的site

我已经编辑了代码的相关部分来解释我的意思。希望这是有道理的:)

表格

view

users_controller.rb:

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

_department.html.erb:

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

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