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

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


person kid_drew    schedule 26.02.2013    source источник


Ответы (2)


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

В вики по драгоценным камням есть хорошее объяснение того, как построить форму с использованием ancestry

Надеюсь, поможет

person Sergey Kishenin    schedule 26.02.2013
comment
Так что, может быть, я просто не понимаю, как правильно настроить модель категории. Если я добавлю: parent_id select в свою форму, я получу от контроллера ошибку Can't mass-assign protected attributes: parent_id. Нужно ли мне иметь как происхождение, так и столбец parent_id? - person kid_drew; 26.02.2013
comment
Вам не нужно иметь parent_id в вашей базе данных, только ancestry столбец. Но вы должны поместить parent_id в attr_accessible, чтобы избежать ошибки массового назначения - person Sergey Kishenin; 26.02.2013

Ancestry проверяет свое поле с помощью person hlcs    schedule 27.12.2015