2013-02-26 4 views
4

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

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

Пока пользователь выбирает существующий узел, все хорошо. Если пользователь выбирает пробел в раскрывающемся списке, я ожидаю, что Ancestry создаст корневой узел, но вместо этого форма выдает ошибку «недействительна».

Мой контроллер ничего не делает mindblowing:

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, так что я не знаю, как атаковать эту проблему. Есть ли какая-то конфигурация для Происхождения, которую я пропустил, или, возможно, это проверка подлинности формы?

ответ

6

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

Существует хорошее объяснение в gem's wiki, как построить форму, используя ancestry

Надеются, что это помогает

+0

Так что, может быть, я просто не понимаю, как правильно настроить модель категории. Если я добавлю: parent_id выберите в мою форму, я получаю сообщение «Can not mass-assign protected attributes: parent_id» от контроллера. Должен ли я иметь как родословную, так и родительский столбец? –

+1

Вам не нужно иметь 'parent_id' в вашей базе данных, просто столбце' ancestry'. Но вам нужно поставить 'parent_id' на' attr_accessible', чтобы избежать ошибки массового присвоения –

+0

Это сделало это, спасибо! –

1

Восходящее проверяет его поле с 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