0

次の構造のネストされたフォームがあります。

  • リスト
    • アイテム

リスト モデルで検証を実行して、各リストに最大 10 個のアイテムしか含まれていないことを確認します。

validate :max_stack_items

def max_stack_items
  if items.size > 10
    errors[:base] << "Stack cannot have more than 10 items"
end

これは 90% の確率で問題なく動作します。リスト フォーム内のリスト アイテムを次のように削除できる機能を実装しました。

<%= f.hidden_field :_destroy %>
<%= link_to "remove item", '#', class: "remove_fields" %>

これを実現する関連するJavaScriptがいくつかあります(質問には重要ではありません)。

すでに 10 個のリスト アイテムがあり、フォームを編集するとします。「アイテムの削除」リンクをクリックしてリストアイテムの1つを削除し、新しいリストアイテムを追加した場合。10 個を超えるリスト アイテムがあると見なされるため、検証は失敗します。つまり、1 つのリスト アイテムを削除し、同時に別のリスト アイテムを追加したことを認識しません (つまり、まだ 10 個のリスト アイテムしかありません)。

同時に削除するリスト アイテム レコードを考慮して検証するにはどうすればよいですか?

4

1 に答える 1

5
def max_stack_items
  if restaurants.reject(&:marked_for_destruction?).size > 10
    errors[:base] << "Stack cannot have more than 10 items"
  end
end

この解決策は、検証中に破棄するようにマークされたアイテムを考慮に入れます。

于 2012-06-15T03:37:18.073 に答える