2

私はProductとCategoryの間に非常に共通のHABTM関係を持っています。私はRailscasts Episode #17に基づいています。検証に失敗した後、フォームにHABTM関連オブジェクトを取得するにはどうすればよいですか?

<% for category in Category.find(:all) %> 
    <div> 
    <%= check_box_tag "product[category_ids][]", category.id, @product.categories.include?(category) %> 
    <%= category.name %> 
    </div> 
<% end %> 

が、私は実装したい:私が直面してる問題は、すべてのカテゴリが製品形態(これはR.ベイツはそれのためのビューを持っている方法です)でそれらを表示フェッチする方法に関連していますそれこの方法:

私は私のコントローラで @categoriesを定義している
<% for category in @categories %> 

def edit 
    @categories = Categories.all 
    @product = Product.find params[:id] 
end 

いくつかの検証が失敗するまで、すべてがスムーズに行きます。いくつかのフィールドが空白にすることはできませんと言うので(ProductsControllerの更新アクションの)リダイレクションがeditに戻って私です撃つ:

def update 
    @product = Product.find(params[:id]) 
    @supplier.category_ids = params[:product][:industry_category_ids] ||= [] 

    respond_to do |format| 
    if @product.update_attributes(params[:product]) 
     format.html { redirect_to @supplier, notice: 'Profile was successfully updated.' } 
     format.json { head :ok } 
    else 
     format.html { render action: "edit" } <=== HERE 
    format.json { render json: @supplier.errors, status: :unprocessable_entity } 
    end 
    end 
end 

言って、私は次のエラーを取得するその点、correponding形式で@categoriesことnilです:だから

You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.each 

... 
<% for ic in @industry_categories %> <==== HERE 
... 

、これを実現するためにMVCのベストプラクティスを維持する方法はありますか?または私はちょうどそれをベイトの方法でやらなければならない? form_forは「HABTM」関連オブジェクトのチェックボックスを@productを言うと検証は、ビュー(Category.all)上のものをフェッチすることなく、しかし失敗した後、それにリダイレクトされる(すなわちそれをやって持つことが可能言い換えれば

、されています対応コントローラ@categories = Category.allは前に示した通りです)

ありがとう!

答えて

2

移入の@categoriesあなたが検証に失敗:あなたは「レンダリング:アクション」をするために電話をかけるとき

def update 
    @product = Product.find(params[:id]) 
    @supplier.category_ids = params[:product][:industry_category_ids] ||= [] 

    respond_to do |format| 
    if @product.update_attributes(params[:product]) 
     format.html { redirect_to @supplier, notice: 'Profile was successfully updated.' } 
     format.json { head :ok } 
    else 
    @categories = Categories.all <--- HERE 
    format.html { render action: "edit" } 
    format.json { render json: @supplier.errors, status: :unprocessable_entity } 
    end 
    end 
end 

、Railsは単に現在のリクエストの処理を継続し、にビューのマッピングをレンダリングする:あなたは指定されたアクション。したがって、この場合、(検証に失敗したため) '編集'ビューを再描画していますが、 '更新'アクションで宣言された@categories変数がないため、参照例外が発生しません。

+0

ありがとう、それは仕事をしました! – fgdemussy

関連する問題