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 には別のparent_id属性があり、フォームで使用する必要があります。

を使用してフォームを作成する方法については、 gem の wikiに適切な説明があります。ancestry

それが役に立てば幸い

于 2013-02-26T06:40:27.800 に答える
1

祖先はこれで彼のフィールドを検証します:

# 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 に答える