私は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
は前に示した通りです)
ありがとう!
ありがとう、それは仕事をしました! – fgdemussy