1

ユーザーが新しいプロジェクトを作成するときに、デフォルトでプロジェクトに属する新しいチーム(1対1)とチームに属する新しい役割(多対1)を作成する必要があるという設定があります。プロジェクトを作成する人が最初の役割に結び付けられることを除いて、すべてが期待どおりに機能します。

したがって、ロールには2つの外部キー(team_idとuser_id)があります。team_idのようにuser_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

「current_user.roles.build」という行に何か問題がありますか?@ team.roles.buildが機能している理由がわかりませんが、この他の行は機能していません。

4

2 に答える 2

0

http://guides.rubyonrails.org/association_basics.html#has_many-when_are_objects_saved

ここに2つの問題があります。

  1. build作成されたオブジェクトは保存されません。新しいチームへの関連付けを使用して構築したロールは、チームが保存されたときに保存されます(railsがチームのIDを認識しているため、外部キーを設定できます)。同様に、新しいプロジェクトが保存されると、チームは保存されます。したがって、これらの保存はすべて、プロジェクトを保存するときに行われます。ただし、ユーザーの関連付けを保存して構築した役割をもたらすようなことは何もしません。

  2. create(新しい関連付けられたレコードを保存する)を使用したとしても、つまり、から取得したものとは異なるオブジェクト@user.roles.createを作成するため、私が望むものになってしまうことはありません。Role@team.roles.build

次のようなものは、これらの問題の両方を解決します。

@team.roles << @user.roles.build
于 2012-12-17T19:45:09.057 に答える
0

'@ team.roles <<@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は、最終的にすべてがクリックされた場所です。

于 2012-12-21T02:14:03.070 に答える