4

我正在使用 Ancestry 在 Rails 中构建一个分层类别,并且我允许用户选择他们正在创建的对象的父级。我使用下拉列表显示现有类别:

<%= f.input :ancestry, collection: Category.sorted_list %>

只要用户选择一个现有的节点,一切都很好。如果用户在下拉列表中选择空白,我希望 Ancestry 创建一个根节点,但表单会引发“无效”错误。

我的控制器没有做任何令人兴奋的事情:

def update
  @category = Category.find(params[:id])

  respond_to do |format|
    if @category.update_attributes(params[:category])        
      format.html { redirect_to @category, notice: 'Category was successfully updated.' }        
      format.json { head :no_content }
    else        
      format.html { render action: "edit" }
      format.json { render json: @category.errors, status: :unprocessable_entity }
    end     
  end 
end 

我是 Rails 的新手,所以我不确定如何解决这个问题。是否有我错过的 Ancestry 配置,或者这可能是表单验证器过度保护?

4

2 回答 2

8

发生这种情况是因为ancestry不可能nil,并且手动更改它是一个坏主意,因为所有 gem 的行为都基于此属性。对于这种情况,gem 有另一个parent_id属性,您应该在表单中使用它。

gem的wiki中有一个很好的解释如何使用ancestry

希望能帮助到你

于 2013-02-26T06:40:27.800 回答
1

Ancestry 通过以下方式验证了他的领域

# Validate format of ancestry column value
validates_format_of ancestry_column, :with => Ancestry::ANCESTRY_PATTERN, :allow_nil => true

但是你不能nil在表单中传递值。所以我这样做了:

before_validation do
  self.ancestry = nil if self.ancestry.blank?
end
于 2015-12-27T15:49:34.120 回答