我正在尝试创建一个表单,允许将多个项目成员分配给一个项目。(用户和项目模型通过UserProject关联)
这是我的观点:
<div class="field">
<%= fields_for :projectmember do |u| %>
<%= u.label :projectmember %><br />
<%= select_tag :projectmember, options_for_select(User.all.collect {|u| [u.id, u.lastname]}, :projectmember),:multiple => true, :prompt => 'Select Person' %>
<% end %>
</div>
我已经把项目成员标签到处都放了,但是我想不出如何将这个字段项目成员保存到我的数据库项目和user_projects中!!??
我的projects_controller:
def new
@project = Project.new
@user_project=UserProject.new
@user=User.all
@user_lastnames = User.all.collect do |u|
u.lastname
end
respond_to do |format|
format.html # new.html.erb
format.json { render json: @project }
end
end
和
def create
@project = Project.new(params[:project])
respond_to do |format|
if @project.save
format.html { redirect_to @project, notice: 'Project was successfully created.' }
format.json { render json: @project, status: :created, location: @project }
@user_project=UserProject.create(:project_id => @project.id, :user_id => @project.projectmember)
else
format.html { render action: "new" }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
创建一个实例后,使用控制台的命令:@project=Project.all给出:项目id: 55,项目名称:"fdfd",项目描述:"fdfd",项目首部:"5",项目成员: nil,项目类型名称:"dffd">]
发布于 2012-06-07 05:15:42
假设您的关联如下所示:
class Project < ActiveRecord::Base
has_many :project_users
has_many :users, :through=>:project_users
end
在您的项目表单中,使用以下带有“...for”选项(:name=>'projectuser_ids')的帮助器将选定的ids传递给您的控制器:
<%= select_tag :user_ids, options_for_select(User.all.collect {|u| [u.lastname, u.id]}),:multiple => true, :prompt => 'Select Person', :name=>'project[user_ids][]' %>
这将为您提供参数中选定的ids,然后您必须将您的控制器操作挂接起来以分配它们。例如:
def create
@project = Project.new(params[:project])
users = User.find(params[:project][:user_ids]) rescue []
@project.users = users
if @project.save
...
else
...
end
end
def update
@project = Project.find(params[:id])
users = User.find(params[:project][:user_ids]) rescue []
@project.users = users
if @project.update_attributes(params[:project])
...
else
...
end
end
为了在呈现编辑表单时重新选择选定的项,我假设您必须将其作为参数添加到options_for_select方法中。这一点不是很确定。执行上述所有操作的另一种方法是使用复选框来选择用户,因为可以在呈现表单时为每个分配的用户设置复选标记。祝好运。
发布于 2012-06-07 21:37:51
我的模型确实是这样的:
class Project < ActiveRecord::Base
has_many :project_users
has_many :users, :through=>:project_users
attr_accessible :colourcode, :projectdescription, :user_id, :projectname, :projectheader, :projectmember, :projecttypename
end
我需要在视图中进行更改(否则无法批量分配受保护的属性):
<%= select_tag :user_ids, options_for_select(User.all.collect {|u| [u.lastname, u.id]}),:multiple => true, :prompt => 'Select Person', :name=>'project[user_ids][]' %>
通过
<%= select_tag :projectmember, options_for_select(User.all.collect {|u| [u.lastname, u.id]}),:multiple => true, :prompt => 'Select Person', :name=>'project[projectmember][]' %>
在我的控制器中:
def create
@project = Project.new(params[:project])
users = User.find(params[:project][:projectmember]) rescue []
@project.users = users
respond_to do |format|
if @project.save
format.html { redirect_to @project, notice: 'Project was successfully created.' }
format.json { render json: @project, status: :created, location: @project }
@user_project=UserProject.create(:project_id => @project.id, :user_id => @project.projectmember)
@user_project=UserProject.create(:project_id => @project.id, :user_id => @project.projectheader)
在创建之后,我得到了:
@p=Project.all
Project id: 69, projectname: "test", projectdescription: "blabla", colourcode: "blue", projectheader: "5", projectmember: "---\n- '5'\n- '6'\n", projecttypename: "caucasian">]
@up=UserProject.all
UserProject id: 86, project_id: 69, user_id: 5, created_at: "2012-06-07 13:04:51", updated_at: "2012-06-07 13:04:51">
UserProject id: 87, project_id: 69, user_id: 6, created_at: "2012-06-07 13:04:51", updated_at: "2012-06-07 13:04:51">,
这让我很高兴:)
仍然需要:
如果项目已删除,则自动删除项目/用户对
在屏幕上显示相应的成员名称,而不是id号...
https://stackoverflow.com/questions/10918528
复制相似问题