Rails:如何创建表单以创建新的has_many关系

时间:2013-12-22 12:59:19

标签: ruby-on-rails ruby-on-rails-4

我有一个与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。

2 个答案:

答案 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关系中找到或创建)

https://github.com/nathanvda/cocoon