1

データベースから複数のエントリを破棄しようとしている Rails アプリケーションがあります。

http://localhost:3000/users?ïds[]=1&ids[]=2

私のコントローラーで

def destroy

  ids = params[:ids]
  User.where(:id => ids).destroy_all

end

このようなエラーが発生しています。

ActionController::RoutingError ([DELETE] "/users" に一致するルートはありません):

ルーティング エラーが表示されています..これを修正する方法..よろしくお願いします..

4

3 に答える 3

2

ルートはメンバー用です。delete users/:id{.:format} => destroyつまり、1 つのアイテムのみです。

これには、収集ルートとカスタマイズされたアクションを作成する必要があります。

#routes.rb
resources :users, :collection => {:delete_all => :delete}

#users_controller.rb
def delete_all
  ids = get_ids_from_params
  User.delete_all(["id in (?)", ids])
end
于 2013-01-22T06:01:57.687 に答える
0

より良い解決策は、別のルートを追加することです。破棄アクションを再利用したい場合は、このアプローチを使用できます (ID は整数ベースである必要があります)。

意見

シングルユーザーを破棄するには

link_to(user_path(id), :method => :delete) #  user/1

複数のユーザーを破棄するには

link_to(user_path(ids.join("-")), :method => :delete) #  user/1-2-3

コントローラ

def destroy
  ids = params[:id].split("-")
  User.where(:id => ids).destroy_all
end

これで、破棄アクションは単一/複数の ID で機能します。

于 2013-01-22T06:18:43.023 に答える
0

あなたが与えたリンクは、配列をデフォルトの DELETE ルートに渡すことができるとは言っていません。.delete_allActiveRecord オブジェクトのリレーションまたは配列を呼び出すことができるとだけ言っています。

これが機能しない理由は、 によって提供されるデフォルト ルートしかないためですresources :user。確かに、これには DELETE ルートが含まれます。ですDELETE /users/:id。として配列を渡すことができるかどうかはわかりませんが、:id何かを as として渡すことはできません:ids。これは、ルートと一致しません。

複数のレコードを ID で削除するアクションが本当に必要な場合は、ルート ファイルにカスタム ルートを追加する必要があります。リクエストの正しい形式は、ここusers/destroy_all?ids[]=1&ids[]=2に記載されているように、の行に沿っていると思います。ルートはおそらく次のようになります。

resources :users do
  delete '/users/destroy_all/:ids' => 'users#destroy_all'
end

私は実際にこれを試していないので、うまくいかないかもしれません。

于 2013-01-22T06:00:24.497 に答える