请和我一起露面,只是刷上Rails,并且已经坚持了一段时间,并努力让我的头围绕控制器中的关联。
我有2个模型用户和公司。 (我正在使用Devise for User)
我的用户模型包含client_id列。
目前,用户注册并被定向到我想要创建关系的new_company_path。 (我希望分两步保持这一点。)
我知道我的代码在 companies_controller.rb 中是错误的 - 但它就在我所在的地方
def create
@user = current_user
@company = @user.Company.new(params[:company])
respond_to do |format|
if @company.save
format.html { redirect_to root_path, notice: 'Company was successfully created.' }
format.json { render json: @company, status: :created, location: @company }
else
format.html { render action: "new" }
format.json { render json: @company.errors, status: :unprocessable_entity }
end
end
如果有人能帮助我指出正确的方向,我将不胜感激。谢谢你的时间!
答案 0 :(得分:3)
你的问题在于
@company = @user.Company.new(params[:company])
不应使用大写字母访问用户与公司之间的关联。要让公司与用户相关联,您应该这样称呼它:
@user.company
但是,如果没有公司关联,那么该方法将返回nil并且您无法在nil上调用.new
,因此您需要调用Rails为您创建的另一个方法build_company
,如下所示:
@company = @user.build_company(params[:company])
最后一个问题是,由于用户属于公司,因此需要使用新创建的company_id更新User实例,如果您只保存公司,则不会发生这种情况。但是,当您使用build_company方法时,它会将公司实例存储在User的关联中,因此如果您在用户而不是公司上调用save,它将创建公司并将其链接到用户,如下所示:
def create
@user = current_user
@user.build_company(params[:company])
respond_to do |format|
if @user.save
format.html { redirect_to root_path, notice: 'Company was successfully created.' }
format.json { render json: @user.company, status: :created, location: @user.company }
else
format.html { render action: "new" }
format.json { render json: @user.company.errors, status: :unprocessable_entity }
end
end
end
答案 1 :(得分:1)
您的User
模型需要company_id
列。然后,您可以创建一个表单,以便在任何您喜欢的位置记录该值(即在new_company_path
页面上)。