3

ユーザーと企業の 2 つのモデルがあります。(Devise for User を使用しています)

  • ユーザーは会社に属しています。
  • 会社には多くのユーザーがいます。

私の User モデルには client_id 列が含まれています。

現時点では、ユーザーがサインアップし、関係を作成したい new_company_path に誘導されます。(これを2つのステップに保ちたいと思います)。

ここの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
4

2 に答える 2

4

あなたの問題はラインの中にあります

@company = @user.Company.new(params[:company])

ユーザーから会社への関連付けには、大文字でアクセスしないでください。会社をユーザーに関連付けるには、次のように呼び出す必要があります。

@user.company

ただし、関連付けられている会社がない場合、そのメソッドは nil を返し、nil を呼び出すことはできないため、代わりに Rails が作成して次のよう.newに呼び出す別のメソッドを呼び出す必要があります。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
于 2013-01-14T01:50:43.750 に答える
1

モデルには列Userが必要です。company_id次に、その値を任意の場所 (つまり、new_company_pathページ上) に記録するフォームを作成できます。

于 2013-01-14T01:34:44.010 に答える