1

Ruby およびプログラミング全般の初心者。これまでのところ、私が持っていた質問に対する答えを見つけるのに問題はありませんでしたが、これは見つかりません.

私のアプリでは、Teams コントローラーの new および create アクションが、関連付けられた複数のモデルにわたって複数の新しいレコードを作成しています。これらのレコードの 1 つが作成に失敗しています。これは、下位のレコードが以前に@pool_user実行されているように見えるため、 nil であり、email を null にすることはできないためです。@department@department.id

テストするために、行を削除して特定の値を下@pool_userに挿入すると、期待どおりの順序で実行され、期待どおりにすべてのレコードが作成されました。:userid =>@competence

User モデルに Devise を使用していますが、最初に初期化することに影響を与えている可能性がありますが、正しい順序で実行する方法を見つけることができないようです。

team_controller.rb

def new
  @team = Team.new
  @department = Department.new
  @competence = Competence.new
  @pool_user = User.new
  
  respond_to do |format|
    format.html # new.html.erb
    format.json { render json: @team }
  end
end

def create
  @team = Team.new(params[:team])
  @department = @team.departments.build(:organization_id => User.current.organization_id, :team_id => @team.id)
  @pool_user = @team.users.build(:email => @department.id).save(:validate => false)
  @competence = @team.competences.build(:team_id => @team.id, :user_id => @pool_user.id)


  respond_to do |format|
    if @team.save
      format.html { redirect_to @team, notice: 'Team was successfully created.' }
      format.json { render json: @team, status: :created, location: @team }
    else
      format.html { render action: "new" }
      format.json { render json: @team.errors, status: :unprocessable_entity }
    end
  end
end

ここに表示されている他の悪い慣行や一般的な初心者の動きを自由に修正してください。正しい順序で構築されていない理由を理解したいだけです。ありがとう。

4

2 に答える 2

1

ビルドオンコレクションを呼び出すだけでは、実際にはレコードは保存されません。id属性を使用する前に保存する必要があります。

実行後、

@team = Team.new(params[:team])

また

@department = @team.departments.build(:organization_id => User.current.organization_id, :team_id => @team.id)

@team.idまたは@department.idは、nil値を提供します。

同じように

@team.users.build(:email => @department.id).save(:validate => false) 

ブール値、つまりtrueまたはfalseを返します。

構築後、必要に応じてこの値を明示的に保存する必要があります。

    @team = Team.new(params[:team])
    @team.save

    @pool_user = @team.users.build(:email => @department.id)
    @pool_user.save(:validate => false)

動作するはずです。

実際にコードを書く前に、これをすべてRailsコンソールで試すことをお勧めします。

于 2013-03-22T07:01:42.197 に答える
1

問題は実行順序ではありません。問題は.build、メモリ内にオブジェクトを作成しますが、まだデータベースに保存していないことです。そのため、まだ持ってidいません。.create代わりに使用することもできます。

コードのもう 1 つの問題は、:team_id => @team.id必要のないときに渡してしまうことです。

このコードでは:

@team.departments.build

:team_idメソッドによって暗黙的に設定されbuildます。したがって、次のように簡単に実行できます。

@department = @team.departments.build(:organization_id => ...)
于 2013-03-22T06:57:26.303 に答える