使用belongs_to Association的Rails表单

Ale*_*x P 3 forms ruby-on-rails belongs-to

我对Rails很新,所以这可能是一个明显的问题,如果是这样,我道歉.

我正在尝试创建一个用于创建User记录的表单,该表单 belongs_toTeam模型有关联.到目前为止我所做的是以下......

<% 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 %>
Run Code Online (Sandbox Code Playgroud)

这似乎工作得很好,但在创建用户记录时,我遇到了麻烦.

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
Run Code Online (Sandbox Code Playgroud)

params现在包含一个字段,team_id该字段不是User模型的属性,因此创建失败.我不确定如何解决这个问题,更不用说这是否是解决这个问题的合适方法.任何建议将不胜感激!

trh*_*trh 9

欢迎来到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 %>
Run Code Online (Sandbox Code Playgroud)