Ruby 在多对多关系中添加记录失败
我在Rails应用程序中有一个多对多连接,如下所示: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
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对不起,格式不好,我认为最好将其添加到问题正文中。完成,我已经添加了