使用嵌套属性在一个模型中验证多个模型
Validation of multiple models in one, using Nested Atrributes
所以我尝试构建一个由两个模型的字段组成的表单。
不幸的是,验证只适用于其中之一,尽管它们是相同的。
- 如果第一个字段中有白色符号,控制台显示红色 "rollback" 并且视图显示错误。
- 如果第二个字段中有一个白色符号,一切正常,呈现下一页,没有显示错误,但尚未保存该值。
所以总结一下:验证对两者都有效,但仅在第一个的情况下抛出错误和回滚。另外,我正在使用邪恶的表单向导gem。
我的模型是:
candidate.rb
class Candidate < ApplicationRecord
belongs_to :user
has_one :candidate_form
has_one :employee_form
accepts_nested_attributes_for :candidate_form
accepts_nested_attributes_for :employee_form
end
candidate_form.rb
class CandidateForm < ApplicationRecord
belongs_to :candidate
validates_format_of :name, without: /\W/, allow_blank: true
end
employee_form.rb(可以看到,和candidate_form.rb一样)
class EmployeeForm < ApplicationRecord
belongs_to :candidate
validates_format_of :pesel, without: /\W/, allow_blank: true
end
控制器:
def show
@candidate = current_user.candidate
render_wizard
end
def update
@candidate = current_user.candidate
@candidate.attributes = candidate_params
render_wizard @candidate
end
private
def candidate_params
params.require(:candidate).permit(candidate_form_attributes: [:id, :name],
employee_form_attributes: [:id, :pesel])
end
我的表单结构
<%= form_for @candidate, url: wizard_path, method: "put" do |f| %>
<%= f.fields_for :candidate_form do |cand| %>
<%= cand.text_field :name %>
<% end %>
<%= f.fields_for :employee_form do |emp| %>
<%= emp.text_field :pesel %>
<% end %>
<%= f.submit "NEXT" %>
<% end %>
最后一点说明什么不起作用:
- "Name with a space" - 字段中这样的字符串:name 阻止保存表单,抛出错误,提供回滚
- "Pesel witha a space" - 字段中这样的字符串 :pesel 不会阻止保存表单(只有这个字段不会保存)并且不会发生回滚
哦,没关系。 :pesel 是数据库中的整数类型。将其更改为字符串可使一切正常运行。
所以我尝试构建一个由两个模型的字段组成的表单。 不幸的是,验证只适用于其中之一,尽管它们是相同的。
- 如果第一个字段中有白色符号,控制台显示红色 "rollback" 并且视图显示错误。
- 如果第二个字段中有一个白色符号,一切正常,呈现下一页,没有显示错误,但尚未保存该值。
所以总结一下:验证对两者都有效,但仅在第一个的情况下抛出错误和回滚。另外,我正在使用邪恶的表单向导gem。
我的模型是:
candidate.rb
class Candidate < ApplicationRecord
belongs_to :user
has_one :candidate_form
has_one :employee_form
accepts_nested_attributes_for :candidate_form
accepts_nested_attributes_for :employee_form
end
candidate_form.rb
class CandidateForm < ApplicationRecord
belongs_to :candidate
validates_format_of :name, without: /\W/, allow_blank: true
end
employee_form.rb(可以看到,和candidate_form.rb一样)
class EmployeeForm < ApplicationRecord
belongs_to :candidate
validates_format_of :pesel, without: /\W/, allow_blank: true
end
控制器:
def show
@candidate = current_user.candidate
render_wizard
end
def update
@candidate = current_user.candidate
@candidate.attributes = candidate_params
render_wizard @candidate
end
private
def candidate_params
params.require(:candidate).permit(candidate_form_attributes: [:id, :name],
employee_form_attributes: [:id, :pesel])
end
我的表单结构
<%= form_for @candidate, url: wizard_path, method: "put" do |f| %>
<%= f.fields_for :candidate_form do |cand| %>
<%= cand.text_field :name %>
<% end %>
<%= f.fields_for :employee_form do |emp| %>
<%= emp.text_field :pesel %>
<% end %>
<%= f.submit "NEXT" %>
<% end %>
最后一点说明什么不起作用:
- "Name with a space" - 字段中这样的字符串:name 阻止保存表单,抛出错误,提供回滚
- "Pesel witha a space" - 字段中这样的字符串 :pesel 不会阻止保存表单(只有这个字段不会保存)并且不会发生回滚
哦,没关系。 :pesel 是数据库中的整数类型。将其更改为字符串可使一切正常运行。