我有一个设置,当用户创建新项目时,他们默认情况下必须创建一个属于项目的新团队(一对一)和一个属于团队的新角色(多对一) )。一切都按预期工作,除了我还希望创建项目的人与第一个角色绑定。
因此,角色有两个外键(team_id和user_id)。我似乎无法让user_id像team_id那样填充。这是代码:
class ProjectsController < ApplicationController
before_filter :signed_in_user, only: [:show, :edit, :update, :destroy]
before_filter :correct_or_admin_user, only: [:edit, :update, :destroy]
def new
@user = current_user
@project = Project.new
@team = @project.build_team
@user.roles.build
@team.roles.build
end
def create
@project = current_user.projects.new(params[:project])
if @project.save
flash[:success] = "Your new project has been created!"
redirect_to @project
else
render 'new'
end
end
该行&#34; current_user.roles.build有什么问题吗?我不明白为什么@ team.roles.build正在工作但不是另一条线。
答案 0 :(得分:0)
http://guides.rubyonrails.org/association_basics.html#has_many-when_are_objects_saved
我在这里看到两个问题:
build
不保存创建的对象。当团队得到保存时(当rails知道团队的id是什么时,它可以设置外键),您与新团队的关联构建的角色会被保存。同样,当新项目保存时,团队会得到保存。因此,当您保存项目时,所有这些都会发生。但是,您不会做任何会导致您在保存用户关联的情况下构建的角色。
即使您使用create
(保存新的关联记录),即@user.roles.create
,您也不会得到我认为您想要的东西,因为您将成为创建与Role
获得的对象不同的@team.roles.build
对象。
以下内容可以解决这两个问题。
@team.roles << @user.roles.build
答案 1 :(得分:0)
我能够用'@ team.roles&lt;&lt;来弄清楚你得到了什么。 @ user.roles.build”。我无法使用@ team.roles,因为据我所知,此实例的范围仅限于新功能。此外键的创建也必须在create中进行,因为直到项目保存后才会生成角色。
我最终做的是在if @ project.save行后面的create方法中添加了以下内容:
current_user.roles << @project.team.roles(params[:project])
然后我完全删除了@ user.roles.build。来自http://guides.rubyonrails.org/association_basics.html#has_many-association-reference的第4.3.1.2节是我最终点击的所有内容。