关联belongs_to vs表单中的嵌套属性

时间:2015-05-10 14:51:54

标签: ruby-on-rails ruby-on-rails-4 associations simple-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表只是一个用户组列表,例如主持人,用户等。所以我需要在表单中选择一个组并创建一个具有关联的新用户。我究竟做错了什么?我是否需要在create操作中找到一个组并将其作为@user.user_group = the_chosen_group传递?

P.S。 它是UserGroup的正确名称约定吗?也许我应该把它称为群组?

问候。

1 个答案:

答案 0 :(得分:1)

仅当您希望允许通过对象本身编辑关联对象时,才应使用嵌套属性。简而言之,每次提交您创建的表单时,rails都会收到以下内容:

{ username: 'sth', user_group_attributes: { name: 'Group name' }

当您分配这样的属性时,rails会创建新的属性组,因为它不知道是否要搜索这样的组。

由于您只想将给定用户分配给usergrooup,因此根本不需要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