我有一个与has_and_belongs_to_many
关系链接的用户和项目模型(每个用户可以是多个项目的一部分,他们可以是多个项目的创建者)。我想创建一个表单来将用户添加到项目中。用户需要输入另一个用户的用户名才能添加他。我怎么能这样做?
这是我尝试过的:
<%= form_for(@project) do |f| %>
<%= f.label :username, "Username" %>
<%= f.text_field :users %>
<%= f.submit "Add" %>
<% end %>
然后在控制器中我会做这样的事情:
def add_user
@project = Project.find(params[:id])
user = User.find_by(username: params[:username])
user.projects << @project
user.save
redirect_to @project
end
问题是用户的文本字段没有按照我的想法执行,它会输出@project.users
inspect(#<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_User:0x007fc3e98e8d70>
)。
我看到了嵌套表单,但我不认为这是合适的,因为已经创建了用户和项目。我正在使用rails 4。
答案 0 :(得分:1)
嵌套表单不只是用于创建新记录,您也可以使用它来添加连接模型
我会看accepts_nested_attributes_for
接受
的嵌套属性我个人会尝试这个:
#app/controllers/projects_controller.rb
def new
@project = Project.new
@project.projects_users.build
end
def create
@project = Project.new(project_params)
@project.save
end
def edit
@project = Project.find(params[:id])
end
def update
@project = Project.find(params[:id])
@project.save
end
private
def project_params
params.require(:project).permit(:project, :params, projects_users_attributes: [:user_id])
end
#app/models/project.rb
Class Project < ActiveRecord::Base
accepts_nested_attributes_for :projects_users
end
#app/views/projects/edit.html.erb
<%= form_for(@project) do |f| %>
<%= f.fields_for :projects_users %>
<%= f.label :username, "User ID" %>
<%= f.text_field :user_id %> #-> can change to <select> later
<% end %>
<%= f.submit "Add" %>
<% end %>
答案 1 :(得分:0)
看看茧宝石。它提供了一些嵌套的表单内容,这些内容很难用架子功能的rails来解决。我最近用它来做一些非常相似的事情(在M2M关系中找到或创建)