我正在使用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的配置,还是这个表格验证器可能过度保护?
答案 0 :(得分:7)
这种情况发生是因为ancestry
不能是nil
而且手动更改它是个坏主意,因为所有gem的行为都是基于此属性的。对于这种情况,gem有另一个parent_id
属性,您应该在表单中使用。
gem's wiki如何使用ancestry
希望有所帮助
答案 1 :(得分:1)
Ancestry用this验证他的领域:
# 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