0

私はFormObject、ユーザーを作成する登録用と、メソッド内の彼のための多くのモデルを持っています。create

def create
  ActiveRecord::Base.transaction do
    @user = User.create(@params[:user])
    process_bonuses_for_user
    process_actions_for_user
    # et.c., giant amount of methods
  end

  @user.persisted? # to return the true of false to controller
end

の奇妙な行動に出会いましたFormObject。正常に実行された (多くのモデルを作成した) か失敗した (保存しない) 場合でもidUserモデルは自動インクリメントされます。したがって、ユーザーFormObjectの次の値をインクリメントして何かを保存しようとするたびに。idこれは正常にUser作成された場合の正常な状況ですが、ユーザーが登録フォームを間違えた場合は正常ではありません。

この予測不可能な動作を無効にするにはどうすればよいですか?

PSメソッド@user = User.new(@params[:user])の開始時と終了時に書くとすべてがうまくいくことはわかっていますが、多くの関連付けがあり、モデルにたくさん書きたくありません。create@user.saveautosaveinverse_of

PPS 私はpostgresql-9.4ユーザーです

4

2 に答える 2

0

を使用しているため、トランザクションが機能していませんcreate。bang バージョン ( create!) を使用して、失敗時にロールバックをトリガーする例外を発生させる必要があります。rescue自分でInvalidRecord例外を作成する必要があることに注意してください。

于 2015-06-25T08:22:49.707 に答える
0

私の意見では、それは次のようなものかもしれません:

  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
         process_bonuses_for_user
         process_actions_for_user
         # et.c., giant amount of methods
         ...
         format.html { redirect_to ... }
      end
    end
于 2015-06-25T10:39:43.210 に答える