我有模型,用户可以分开多个项目,项目可以有多个用户。它们由一个名为project_users的表连接在一起。 在我的新项目表单中,我有一个显示当前用户的所有用户名的选择框,可以选择多个用户名。如何为所选的每个用户在project_users中添加一个条目? (或者如果有更好的方法来建模我的数据,请告诉我......)
class Project < ActiveRecord::Base
has_many :project_users
has_many :users, :through => :project_users
end
class ProjectUser < ActiveRecord::Base
has_one :project
has_one :user
belongs_to :project
belongs_to :user
end
class User < ActiveRecord::Base
has_many :project_users
has_many :users, :through => :project_users
end
在我的项目_form.html.erb中我有:
<div class="field">
<%= "Users assigned to project" %>
<%= select_tag("user[user_id]", options_from_collection_for_select(User.find(:all), 'id', 'username')) %>
</div>
这将使用所有用户的用户名填充选择框。
projects_controller.rb
def create
@project = Project.new(project_params)
@project_count = Project.count + 1
@project_user = ProjectUser.new
@project_user.user_id = current_user.id
@project_user.project_id = @project_count
respond_to do |format|
if @project.save
if @project_user.save
format.html { redirect_to @project, notice: 'Project was successfully created.' }
format.json { render action: 'show', status: :created, location: @project }
else
format.html { render action: 'new' }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
format.html { redirect_to @project, notice: 'Project was successfully created.' }
format.json { render action: 'show', status: :created, location: @project }
else
format.html { render action: 'new' }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
def project_params
params.require(:project).permit(:name, :description, :user_id)
end
我是Ruby on Rails的新手,所以任何帮助都会很棒(或链接到相关文章,我在过去的两个小时里试图弄明白这一点后我无法绊倒...)
我现在更新了我的代码,它可以运行,现在将用户添加到project_users!但是现在,我只有一个下拉框,这意味着我每个项目只能选择一个用户。反正有没有选择框,可以选择多个用户?或者我是否必须编辑项目,并将它们一次添加到project_users中?
答案 0 :(得分:0)
建议您使用像
这样的rails助手options_from_collection_for_select
或
options_for_select
rails的主要功能是遵循规则和约定并使用这样的帮助程序,而不是手动尝试编写相同的代码。我最近听到它被称为“脱轨”,这是我第一次在轨道上的'rails'部分对我有意义!
答案 1 :(得分:0)
我还没有对它进行测试,因为我没有在我的家用电脑上进行设置,但它会是这样的。
@project = Project.new(name: params[:name], description: params[:description])
params[user_id].to_a.each do |user_id|
@project.project_users.build(user_id: user_id)
end