Rails表单与belongs_to关联

5

我对Rails非常新手,所以这可能是一个显而易见的问题,如果是这样,我很抱歉。

我正在尝试创建一个创建User记录的表单,该记录与Team模型具有belongs_to关联。 我目前所做的是...

<% form_for @user, url: {action: "create"} do |f| %>
  <%= f.text_field :name %>
  <%= f.text_field :email %>

  <% f.fields_for :team do |team| %>
    <%= team.collection_select(:team_id, Team.all, :id, :name) %>
  <% end %>
  <%= f.submit %>
<% end %>

这似乎运行得足够好,但是在创建用户记录时我遇到了麻烦。

def create
  @team = Team.find(params[:user][:team][:team_id])
  @team.users.create(user_params)
  # Ignoring error checking for brevity
end

def user_params
    params.require(:user).permit(:name, :email)
end

现在的params包含一个team_id字段,这不是User模型的属性,因此无法创建。我不确定如何解决这个问题,更不知道这是否是适当的方法。欢迎提出任何建议!

如果用户属于一个团队,那么它应该有一个team_id,因为belongs_to在具有外键的一侧?此外,除非您正在处理嵌套属性,否则不需要fields_for。 - Doon
对不起,我并不完全清楚belongs_to关联实际上是如何工作的,你是对的。谢谢! - Alex P
2个回答

12

欢迎来到 Rails :)

如果目标是确保每个用户都可以成为团队的一部分,那么您按照这种方式处理关联没有问题。

因此,首先需要确保在用户模型上存在 team_id。其次,如Doon建议的那样,除非要与团队模型进行交互并在同一表单中进行更改,否则不需要使用 fields_for

首先创建一个迁移文件:rails g migration add_team_to_user team:belongs_to

在迁移文件中使用 belongs_to 可以添加引用,您可以在此了解相关信息:http://edgeguides.rubyonrails.org/active_record_migrations.html

然后迁移数据库:bundle exec rake db:migrate

并重新启动服务器。然后像这样更改表单:

<% form_for @user, url: {action: "create"} do |f| %>
  <%= f.text_field :name %>
  <%= f.text_field :email %>
  <%= f.collection_select(:team_id, Team.all, :id, :name) %>

  <%= f.submit %>
<% end %>

3

使用宝石 https://github.com/plataformatec/simple_form,这个很容易实现。

关联

要处理关联,Simple Form 可以生成选择输入、一系列的单选按钮或复选框。让我们看看它是如何工作的:想象一下您有一个用户模型,该模型属于一个公司并且具有多个角色。结构应该类似于:

class User < ActiveRecord::Base
  belongs_to :company
  has_and_belongs_to_many :roles
end

class Company < ActiveRecord::Base
  has_many :users
end

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end

现在我们有一个用户表单:
<%= simple_form_for @user do |f| %>
  <%= f.input :name %>
  <%= f.association :company %>
  <%= f.association :roles %>
  <%= f.button :submit %>
<% end %>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接