Родословная родословной с нулевым родителем

Я строю иерархическую категорию в Rails, используя Ancestry, и я позволяю пользователю выбирать родителя объекта, который они создают. Я отображаю существующие категории, используя выпадающий список:

<%= 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, которую я пропустил, или это средство проверки формы, возможно, чрезмерно защищает?

2 ответа

Решение

Это происходит потому, что ancestry не может быть nil и это плохая идея, чтобы изменить его вручную, потому что все поведение драгоценного камня основано на этом атрибуте. Для таких случаев драгоценный камень имеет другой parent_id атрибут, который вы должны использовать в своей форме.

В вики gem есть хорошее объяснение , как создавать формы, используя 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
Другие вопросы по тегам