我有一个可以拥有许多汽车的模型人员,我想创建一个嵌套表格,一次创建两个汽车记录,我正在使用accepts_nested_attributes_for
。允许一次创建两个汽车记录:
一个人可以将一个或两个汽车领域留空,我正在使用allow_blank
来处理。
型号:
#### Model: Car
class Car < ActiveRecord::Base
belongs_to :person
validates :registration_number, uniqueness: true, allow_blank: true,
format: {with: SOME_REGEX}
validate :both_cars_registration_cant_be_same
def both_cars_registration_cant_be_same
car1 = registration_number if type == 'hatchback'
car2 = registration_number if type == 'sedan'
if car1 == car2
errors.add(:registration_number, "Both number can't be same")
end
end
### Model : Person
class Person < ActiveRecord::Base
has_many :cars
accepts_nested_attributes_for :cars, allow_destroy: true,
reject_if: proc { |attr| attr['registration_number'].blank? }
控制器:
### Controller : Person
class PersonsController < ApplicationController
def new
@person = Person.new
2.times { @person.cars.build }
end
以下是部分
的小片段...
...
### _form.html.erb ###
<%= f.fields_for :cars do |car|
<%= render 'car_form', c: car %>
<% end %>
...
...
### _car_form.html.erb ###
<% if c.index == 0 %>
<p>Type: Sedan</p>
<%= c.hidden_field :type, value: "sedan" %>
<% else %>
<p>Type: Hatchback</p>
<%= c.hidden_field :type, value: "hatchback" %>
<% end %>
<div>
<%= c.label :registration_number %>
<%= c.text_field :registration_number %>
</div>
我可以在rails控制台中使用来自Cars模型的validate :both_cars_registration_cant_be_same
valid?
但是如何从父模型(人)运行此验证,以便在提交表单时收到错误消息两辆车的注册号相同?我想验证为两条记录输入的注册号字段必须不同且不相同。另请告诉我,如果我在index
对象上使用fields_for
我的表单助手是否是正确的方法呢?
P.S:使用rails 4
答案 0 :(得分:0)
将汽车验证移至Person模型。这个问题可能对您有所帮助:Validate that an object has one or more associated objects
答案 1 :(得分:0)
这是一个例子
belongs_to :project
validates_uniqueness_of :title, allow_blank: false, conditions: -> {where(parent_id: nil)}, scope: :project
使用范围验证选项 http://guides.rubyonrails.org/active_record_validations.html