无法在控制器中创建belongs_to关联

时间:2013-01-14 01:32:04

标签: ruby-on-rails-3 activerecord rails-models

请和我一起露面,只是刷上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

如果有人能帮助我指出正确的方向,我将不胜感激。谢谢你的时间!

2 个答案:

答案 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页面上)。