是否存在有条件地阻止创建对象的方法。
我有Person
班has_many :contacts
。如果我尝试在不提供地址的情况下初始化Contact
,则不应创建联系人。
我可以在一个人物中做到这一点:
person.contacts << Contact.new(params[:contact]) if params[:address].present?
但是我可以在Contact类中执行此操作吗?即在没有上述if
条件的情况下阻止添加新联系人。
问题的原因是,如果我在表单上有联系人字段,每个字段都有一个地址,并且隐藏字段中有自己的contact_type,那么即使未填充地址字段,也会创建联系人对象。
更新
进一步的想法,以下是我考虑的其他选项,但都有缺点:
在强params方法中迭代params哈希并删除对没有地址params[:person][:contacts_attributes].delete_if { |key, value| value[:address].blank? }
的联系人的任何引用。这有效,但显然多态模型可能是DRYer。
Person
和Business
对象中创建工厂方法,以定义评估要创建的人员的传入请求,并删除任何没有地址的联系人。我假设这可以通过抽象到模块中来实现DRY,但这种情况对于这种情况来说感觉相当复杂。 目前上面的选项1是我将要使用的内容,但如果在Contact
对象中可以执行某些操作,我真的很感兴趣。
答案 0 :(得分:0)
这是基于上面的评论,您执行对地址字段的存在进行验证
似乎应该有更好的方法来做到这一点,但是,这对你有用吗?
new_contact = Contact.new(params)
person.contacts << new_contact if new_contact.valid?
<强>更新强>
这样做的正确方法可能是这样的
begin
person.contacts.create! params
rescue ActiveRecord::RecordInvalid => e
end
答案 1 :(得分:0)
它可能应该在控制器中
在创建方法中
def create
@contact = Contact.new(params.require(:address).permit(:phone number, contact_type)
<end>
这将不允许在没有地址的情况下创建联系人,但允许电话号码和联系人类型为空。
答案 2 :(得分:0)
我认为答案如下:
accepts_nested_attributes_for :contacts, allow_destroy:true, reject_if: proc { |attributes| attributes[:address].blank? }
如果我添加reject_if proc,那么任何没有地址的提交似乎都会被忽略。