繁体   English   中英

使用belongs_to Association的Rails表单

[英]Rails Form with belongs_to Association

我对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模型的属性,因此创建失败。 我不确定如何解决这个问题,更不用说这是否是解决这个问题的合适方法。 任何建议将不胜感激!

欢迎来到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 %>

这很容易使用gem https://github.com/plataformatec/simple_form

协会

为了处理关联,Simple Form可以生成选择输入,一系列无线电按钮或复选框。 让我们看看它是如何工作的:想象一下你有一个属于公司的用户模型和has_and_belongs_to_many角色。 结构将类似于:

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 %>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM