Module: Spree::Admin::AssetsControllerDecorator

Defined in:
app/controllers/spree/admin/assets_controller_decorator.rb

Instance Method Summary collapse

Instance Method Details

#updateObject

@gem-override spree_admin-5.3.6/app/controllers/spree/admin/assets_controller.rb#update 並び替え (stimulus-sortable) は移動した 1 件だけに asset を送るが、 その値は DB の position ではなく「画面上のインデックス + 1」である。 acts_as_list は送られた position が既存レコードと衝突したときしか周囲を 詰め直さないため、position が 1..N の連番でないと 200 を返すのに並び順が 変わらない。並び替えのときだけ、先に連番へ詰め直してから本家の更新に渡す。

詰め直しと本家の更新は 1 つのトランザクションに入れ、採番(Spree::AssetDecorator)と 同じ viewable 行ロックを取る。そうしないと、詰め直してから更新するまでの間に アップロードが 1 件 INSERT され、本家が前提にしている「1..N の連番」が崩れる。 ロックを保持したままレスポンスを描画することになるが、並び替えの応答は JSON 1 件か小さな turbo_stream なので影響は小さい。



18
19
20
21
22
23
24
25
26
# File 'app/controllers/spree/admin/assets_controller_decorator.rb', line 18

def update
  return super unless sorting_request?

  Spree::Asset.transaction do
    @asset.lock_viewable_row
    normalize_positions
    super
  end
end