如果条件为真,Rails仅初始化对象

时间:2014-12-10 20:33:42

标签: ruby-on-rails ruby-on-rails-4

是否存在有条件地阻止创建对象的方法。

我有Personhas_many :contacts。如果我尝试在不提供地址的情况下初始化Contact,则不应创建联系人。

我可以在一个人物中做到这一点:

person.contacts << Contact.new(params[:contact]) if params[:address].present?

但是我可以在Contact类中执行此操作吗?即在没有上述if条件的情况下阻止添加新联系人。

问题的原因是,如果我在表单上有联系人字段,每个字段都有一个地址,并且隐藏字段中有自己的contact_type,那么即使未填充地址字段,也会创建联系人对象。

更新

进一步的想法,以下是我考虑的其他选项,但都有缺点:

  1. 从params中删除任何不包含地址的联系人:
  2. 在强params方法中迭代params哈希并删除对没有地址params[:person][:contacts_attributes].delete_if { |key, value| value[:address].blank? }的联系人的任何引用。这有效,但显然多态模型可能是DRYer。

    1. PersonBusiness对象中创建工厂方法,以定义评估要创建的人员的传入请求,并删除任何没有地址的联系人。我假设这可以通过抽象到模块中来实现DRY,但这种情况对于这种情况来说感觉相当复杂。
    2. 目前上面的选项1是我将要使用的内容,但如果在Contact对象中可以执行某些操作,我真的很感兴趣。

3 个答案:

答案 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,那么任何没有地址的提交似乎都会被忽略。