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