【问题标题】:Skip validations for nested attributes in Rails 3?跳过 Rails 3 中嵌套属性的验证?
【发布时间】:2012-03-02 07:50:16
【问题描述】:

我目前正在使用嵌套的表单/字段_for,我想知道是否有一种简单的方法可以跳过对嵌套属性的验证?

我可以在某处挤压一个 object.nested_object.save(:validate => false) 吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 validation


    【解决方案1】:

    您只需要分两部分进行保存。第一部分是关于父类的保存,第二部分是关于嵌套的

    如果您在此嵌套字段上使用 accepts_nested_attributes_for

    def create
      nested_params = params[:object].delete(:nested_attributes)
      if object = Object.create(params[:object]) && 
        object.update_attributes(nested_params, :validate => false)
        redirect_to object_url(object)
      else
        render :new
      end
    end
    

    更新来自 Cojones 的评论:

    如果您不使用此选项,则需要直接指定nested_attribute,如注释说明:

    def create
      nested_params = params[:object].delete(:nested_attributes)
      if object = Object.create(params[:object]) && 
        object.nested_object.update_attributes(nested_params, :validate => false)
        redirect_to object_url(object)
      else
        render :new
      end
    end
    

    更多信息请查看评论。

    【讨论】:

    • 这正是我所需要的。非常感谢!
    • 我试图将其付诸实践,但失败了:未定义的方法`{"user_id"=>...你确定要调用'update_attribute'吗?因为根据 API,该方法需要属性名称作为第一个参数。
    • 是的,这是一个错字问题,它是update_attributes 我在我的答案中修正了它
    • object.update_attributes(nested_params, :validate => false) 也不起作用,因为它试图将嵌套对象的属性分配给对象本身。 object.nested_object.update_attributes(nested_params, :validate => false) 成功了。再次感谢!
    • 取决于你是否使用accept_attributes_nested。我用这些信息更新我的答案
    猜你喜欢
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    相关资源
    最近更新 更多