1

ネストされたリソースに奇妙なバグがあります。私は、売り手が多くの車を所有する売り手/車の関係を持っています。ここで、販売者に属する車から車を削除する必要があります (販売者は Sessions#create を介して認証され、その ID は session[:seller_id] に保存されます)。

これは、この特定の販売者に属するすべての車をリストする Car Index View です。

<%= @cars.each do |car| %>
<tr>
<td><%= car.brand %></tr></td>
<td><%= link_to 'Edit', edit_seller_car_path(session[:seller_id], car) %></td>
<td><%= link_to 'Destroy', seller_car_path(session[:seller_id], car) %></td>
</tr>
<% end %>

認証された販売者に属するすべての車をリストする Car インデックスに立つと、URL は localhost:3000/sellers/2/cars のようになります。このページには、編集ボタンと破棄ボタンを備えた車の一覧表が表示されます (編集は正常に機能します)。

Cars#destroy は次のとおりです。

@seller = Seller.find(params[:seller_id])
@car = @seller.cars.find(params[:id])
@car.destroy
flash[:notice] = "Deleted"
redirect_to seller_cars_url(session[:seller_id])

Cars#edit は次のとおりです (編集時に問題なく動作しています)。

@seller  = Seller.find(params[:seller_id])
@car = @seller.cars.find(params[:id])

破棄ボタンをクリックすると、次のバグが発生します。

1) 奇妙なことに、車はまだ正常に削除されています。

2) ルーティング エラーが発生します。

No route matches {:action => "edit", :controller => "cars", :seller_id=>nil, id=>#<Car id:23, brand:"Opel"...

ここでの問題は、インデックス ページの [編集] ボタンで発生したようです。それが参照している車はテーブルの最初の車であり、seller_id はここでは nil です。つまり、seller_id はセッション [:seller_id] に保持されていません。これは Sessions#destroy の行為です。

3) 販売者がログアウトしていることに気付きました。あたかも Car コントローラの destroy が、セッションをクリアする Destroy in Sessions コントローラを呼び出したかのように。

4) Cars インデックスの URL は正しいようです: localhost:3000/sellers/2/cars ですが、2 で述べたルーティング エラーがまだ見られます。

この奇妙な振る舞いについて教えていただければ幸いです。ありがとうございました。

4

0 に答える 0