小试rails当中对多重选择表单的处理


keys: ruby rails multiple checkbox

今天上班给老板写个项目销售管理的小东西,其中涉及到多重选择的处理。目前感觉rails在这方面相对弱,也许因为rails在其它方面太强了吧。总之,对于用rails处理multiple checkbox,还真需要些基础知识。

例子中的任务是为一个项目project指定人员user_file,这显然是一个N对N(HABTM)的关联,按照David的建议,我把关联表project_user_map也作为实体处理了。

介绍一下模型 model:

class Project …
has_many :project_user_maps
end

class ProjectUserMap

belongs_to :project
belongs_to :user_file
end

class UserFile
has_many :project_user_maps
end

先说view:

<% form_tag :action => ‘edit_member_2’, :id => @project do %>
<% for user_file in @all%>
<%= check_box_tag( ‘selected_file_ids[]’, user_file.id, @members.include?(user_file))%><%= user_file.name%>
<% end %>
<br/>
<%= submit_tag ‘完成!’ %>
<% end %>

要点是selected_file_ids[],这样提交以后,rails会生成一个对应的数组。@all是全部可选项;@members是被选中的选项。

然后是controller:

def edit_member_2
@project = Project.find(params[:id])
member_ids = params[:selected_file_ids]
ProjectUserMap.transaction do
@project.project_user_maps.each { |pum|
pum.destroy
}
member_ids.each {|uf|
m = ProjectUserMap.new
m.user_file_id = uf
@project.project_user_maps << m
m.save()
}
@project.save
end
redirect_to :action => ‘show’, :id => @project
end

这段只能说运行没问题,肯定还有改进余地的:) 参考1