关联 belongs_to 与表单中的嵌套属性
Association belongs_to vs nested attributes in the form
我的情况如下:
class User < ActiveRecord::Base
belongs_to :user_group
accepts_nested_attributes_for :user_group
end
class UserGroup < ActiveRecord::Base
has_many :users
end
控制器:
UsersController < ApplicationControler
def new
@user = User.new
@user.build_user_group
end
def create
@user = User.new(user_params)
if @user.save
# do something
else
# do something
end
end
private
def user_params
params.require(:user).permit(:email, :username, user_group_attributes: [:name])
end
end
表格:
= simple_form_for @user do |f|
= f.input :username
= f.simple_fields_for :user_group do |builder|
= builder.input :name, collection: UserGroup.all.map(&:name), prompt: "Choose one"
= f.input :email
= f.button :submit, 'Create', class: 'btn btn-success'
但它不会创建用户与 user_group 之间的关联。 UserGroup table 只是用户组的列表,例如主持人,用户等。所以我需要在表单中 select 一个组并创建一个具有关联的新用户。我究竟做错了什么?我是否需要在 create
操作中找到一个组并将其作为 @user.user_group = the_chosen_group
传递?
P.S。
它是 UserGroup 的专有名称约定吗?也许我应该称它为组?
此致。
仅当您希望允许通过对象本身编辑关联对象时才应使用嵌套属性。简而言之,每次提交您创建的表单时,rails 都会收到如下参数:
{ username: 'sth', user_group_attributes: { name: 'Group name' }
当您像这样分配属性时,rails 将创建新的属性组,因为它不知道要搜索这样的组。
因为您只想将给定用户分配给用户组,所以根本不需要 nested_attributes。您只需要:
= simple_form_for @user do |f|
= f.input :username
= f.input :user_group_id, collection: UserGroup.all.pluck(:name, :id), prompt: 'Choose one'
= f.input :email
= f.button :submit, 'Create', class: 'btn btn-success'
在控制器中:
def user_params
params.require(:user).permit(:email, :username, :user_group_id)
end
我的情况如下:
class User < ActiveRecord::Base
belongs_to :user_group
accepts_nested_attributes_for :user_group
end
class UserGroup < ActiveRecord::Base
has_many :users
end
控制器:
UsersController < ApplicationControler
def new
@user = User.new
@user.build_user_group
end
def create
@user = User.new(user_params)
if @user.save
# do something
else
# do something
end
end
private
def user_params
params.require(:user).permit(:email, :username, user_group_attributes: [:name])
end
end
表格:
= simple_form_for @user do |f|
= f.input :username
= f.simple_fields_for :user_group do |builder|
= builder.input :name, collection: UserGroup.all.map(&:name), prompt: "Choose one"
= f.input :email
= f.button :submit, 'Create', class: 'btn btn-success'
但它不会创建用户与 user_group 之间的关联。 UserGroup table 只是用户组的列表,例如主持人,用户等。所以我需要在表单中 select 一个组并创建一个具有关联的新用户。我究竟做错了什么?我是否需要在 create
操作中找到一个组并将其作为 @user.user_group = the_chosen_group
传递?
P.S。 它是 UserGroup 的专有名称约定吗?也许我应该称它为组?
此致。
仅当您希望允许通过对象本身编辑关联对象时才应使用嵌套属性。简而言之,每次提交您创建的表单时,rails 都会收到如下参数:
{ username: 'sth', user_group_attributes: { name: 'Group name' }
当您像这样分配属性时,rails 将创建新的属性组,因为它不知道要搜索这样的组。
因为您只想将给定用户分配给用户组,所以根本不需要 nested_attributes。您只需要:
= simple_form_for @user do |f|
= f.input :username
= f.input :user_group_id, collection: UserGroup.all.pluck(:name, :id), prompt: 'Choose one'
= f.input :email
= f.button :submit, 'Create', class: 'btn btn-success'
在控制器中:
def user_params
params.require(:user).permit(:email, :username, :user_group_id)
end