验证是否可以清除不良数据,但仍然让表单的其余部分继续创建?
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
方法中移除所有正面和背面为空的卡片。
当一种数据形式被提交创建时,验证是否可以只清除不良数据而不创建这些实例,而允许其他“良好数据”继续通过?
所以为了更清楚的场景,假设我正在提交一个正在创建新书的表单,但是在这个表单上有 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
方法中移除所有正面和背面为空的卡片。