验证是否可以清除不良数据,但仍然让表单的其余部分继续创建?

Can a validation weed out bad data, but still let the rest of a form to continue through creation?

当一种数据形式被提交创建时,验证是否可以只清除不良数据而不创建这些实例,而允许其他“良好数据”继续通过?

所以为了更清楚的场景,假设我正在提交一个正在创建新书的表单,但是在这个表单上有 10 个字段可以同时创建 10 本不同的书。我对 Book 进行了验证,表明存在是真实的。当用户填写表格时,假设他们只填写了 10 个书位中的 8 个。由于最后 2 个空 Book 插槽是空白的,验证将停止该创建,但我仍然希望其余数据在创建过程中完成。

我是编码新手,所以我真的很难找到正确的词,所以我可以通过 Google 找到明确的答案。感谢您的帮助!

编辑:我的实际项目使用的是 Card 模型:

class Card < ApplicationRecord
    belongs_to :group

    validates :front,:back, presence: true
end

表格:

    <h3>Cards</h3>
    <%= f.fields_for :cards do |c| %>
        <%= c.label :front %>
        <%= c.text_field :front %>

        <%= c.label :back %>
        <%= c.text_field :back %>
        <br />
    <% end %>

它是一个嵌套形式,所以这是我的组控制器中新的、创建的和强大的参数:

    def new
        if params[:user_id] && @user = User.find_by_id(params[:user_id])
            @group = @user.groups.build
            @group.build_category
            5.times {@group.cards.build}
        else
            @group = Group.new
        end
    end

    def create
        @group = current_user.groups.build(group_params)

        if @group.save
            redirect_to user_groups_path(current_user)
        else
            redirect_to new_user_group_path(current_user)
        end
    end

    private

        def group_params
            params.require(:group).permit(:title, :description, :category_id, category_attributes: [:name], 
                cards_attributes: [:front, :back])
        end

错误:没有错误输出,只是重新呈现新表单页面并以红色突出显示 'field_with_error'。就像它期望所有字段都完整一样。

验证是可以的,并且是必要的,以避免保存缺少字段的记录,所以保留它。

实现您所寻找的最简洁的方法是在您的 Group 模型上设置 accepts_nested_attributes_for :cards, reject_if: :all_blank:all_blank 将拒绝所有属性为空的记录。您也可以设置自己的拒绝记录标准,如下所示:

class Group  < ApplicationRecord
   has_many :cards
   accepts_nested_attributes_for :cards, reject_if: :card_is_empty?

   private
   def card_is_empty?(c)
      c.front.blank? && c.back.blank?
   end
end

另一种方法是在您的 Group 模型上放置一个 before_validation :remove_empty_cards,然后在 remove_empty_cards 方法中移除所有正面和背面为空的卡片。