Ruby 在多对多关系中添加记录失败

Ruby 在多对多关系中添加记录失败,ruby,ruby-on-rails-4,activerecord,Ruby,Ruby On Rails 4,Activerecord,我在Rails应用程序中有一个多对多连接,如下所示: class Workspace has_and_belongs_to_many :users, dependent: :destroy end class User has_and_belongs_to_many :workspaces end class UserWorkspace belongs_to :user belongs_to :workspace end @user.workspaces.create(:w

我在Rails应用程序中有一个多对多连接,如下所示:

class Workspace
  has_and_belongs_to_many :users, dependent: :destroy
end

class User
  has_and_belongs_to_many :workspaces
end

class UserWorkspace
  belongs_to :user
  belongs_to :workspace
end
@user.workspaces.create(:workspace_id => @workspace.id, :role => 1)
模式:

create_table :users_workspaces do |t|
  t.integer :user_id
  t.integer :workspace_id
  t.integer :role, default: 0

  t.timestamps null: false
end
然后我想创建一个新记录,如下所示:

class Workspace
  has_and_belongs_to_many :users, dependent: :destroy
end

class User
  has_and_belongs_to_many :workspaces
end

class UserWorkspace
  belongs_to :user
  belongs_to :workspace
end
@user.workspaces.create(:workspace_id => @workspace.id, :role => 1)
还是这个

@user.workspaces << @workspace
我做错了什么

PS控制器:

def sign_up
respond_to do |format|
  @user = User.new(user_params)
  if @user.save
    @workspace = Workspace.new(title: "#{@user.name}'s workspace")
    @workspace.save
    puts "workspace id: #{@workspace.id}"
    @user.workspaces.create(:workspace_id => @workspace.id, :role => 1)
    puts "workspaces count: #{@user.workspaces.count}"
    @user.workspace = @workspace
    @user.update_attributes(user_params)

    flash.now[:success] = 'Welcome! Please check activation letter in your email box.'
    format.js { render 'signup_message' }
  else
    format.js { render 'render_signup_errors' }
  end
end
end

private

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

您的代码有几个问题。例如,您正在创建已创建的工作区(
@user.workspaces.create
),或允许使用未使用的
:workspace\u id
,等等

请参见下面的代码:

def sign_up
  respond_to do |format|
    @user = User.new(user_params)
    if @user.save

      @workspace = Workspace.new(title: "#{@user.name}'s workspace")

      if @workspace.save
        # Like this
        UserWorkspace.create(user: @user, workspace: @workspace, role: 1)

        # Or, like this
        @user.user_workspaces.create!(workspace_id: @workspace.id, role: 1)
      end

      flash.now[:success] = 'Welcome! Please check activation letter in your email box.'
      format.js { render 'signup_message' }
    else
      format.js { render 'render_signup_errors' }
    end
  end
end

private

# You don't need :workspace_id since you are not using it anywhere
def user_params
  params.require(:user).permit(:email, :password, :password_confirmation, :name)
end

您的
@user
@workspace
对象是否已持久化?请在此处添加控制器代码。`def sign_up response_to do | format |@user=user.new(user_params)if@user.save@workspace=workspace.new(标题:“{@user.name}的工作区”)@workspace.save@user.workspace.create(:workspace_id=>@workspace.id,:role=>1)@user.workspace=@workspace@user.update_attributes(user_params)flash.now[:success]='欢迎!请检查您邮箱中的激活信。'format.js{render'signup_message'}else format.js{render'render\u signup_errors'}end end end end对不起,格式不好,我认为最好将其添加到问题正文中。完成,我已经添加了