¿Cómo enviar una solicitud FETCH para realizar Rails destroy_all?

Supongo que mi conocimiento de API todavía es limitado porque no pude resolver esto.

Tengo una aplicación que se encuentra en React front end y Rails backend. Si quiero eliminar un elemento a la vez, puedo hacer algo como esto:

function deleteSomething(somethingId){ return fetch(`api/something/${somethingId}`, { method: 'DELETE' }) } 

y en el controlador de Rails, hago algo como

  def destroy @something = Something.find(params[:id]).destroy head :no_content end 

Mis rutas se ven así:

 scope :api do resources :something, only: [:index, :show, :create, :update, :destroy] ... 

Esta vez, quiero destruir varios elementos a la vez. Encontré este post de SO que habla sobre destroy_all; Lo probé en la consola de mis Rails y funcionó como magia (¿no es el mismo Rails mágico?).

Sin embargo, no pude averiguar cómo escribir el método de recuperación o el enrutamiento.

  def destroy Something.destroy_all(:name => params[:name]) #if I want to destroy all Model with certain name end 

¿Cómo puedo escribir el método fetch? No creo que deba incluir cada ID individual e iterar uno por uno, porque eso va en contra de la razón por la que quise usar destroy_all en primer lugar.

 function deleteSomehing(name){ return fetch(`api/something/(what goes here?)`, { method: 'DELETE' }) } 

¿A dónde debe dirigirse / direccionarse mi método de búsqueda? ¿Qué hago con el enrutamiento? ¿Debo crear un nuevo método dentro del controlador para esto, o puedo aplastarlo?

EDITAR: Esto es lo que he intentado, pero no funcionó (error: No se Uncaught (in promise) SyntaxError: Unexpected end of JSON input )

 function customDeleteName(name){ return fetch(`api/something/delete_by_name`, { method: 'POST', headers: { 'Content-Tye': 'application/json' }, body: JSON.stringify({ name: name }) }).then((response) => response.json()) } 

Rutas interiores – scope api:

 scope :api do post '/something/delete_by_name' => 'something#delete_by_name' 

Controlador interno:

  def delete_by_name Something.destroy_all(:name => params[:name]) end 

EDIT2:

 #routes scope :api do delete `/something/delete_by_name/:name`, to: 'something#delete_by_name' #controller def delete_by_name Something.destroy_all(:name => params[:name]) head :no_content end ## JS side ## #fetch: function deleteSomething(name){ return fetch(`api/something/delete_by_name/${name}`, { method: 'DELETE' }) } 

Error:

 ActionController::RoutingError (No route matches [DELETE] "/api/something/delete_by_name/somename"): 

Creo que crearía un método / acción específico para él en el controlador. Dado el nombre del modelo, puedes hacer:

 "something".capitalize.constantize.destroy_all 

Si something tiene 2 nombres, deberá capitalizarlo correctamente antes de llamar a constantize.

 scope :api do ... delete 'your/beautiful/route/:name', to: 'wherewild#thingsare' wherewild_controller.rb def thingsare #do magic rails end 

Ahora, tendrá un problema si elige la misma ruta de ruta que está usando para la eliminación actual, por lo que es mejor elegir otra.

Descubrí cómo hacerlo. La respuesta de @Micael, aunque no lo resolvió exactamente, me llevó a la dirección correcta. ¡Muchas gracias a él!

Hice un método POST en el método / ruta personalizado, y funcionó:

 #controller def delete_by_name Something.destroy_all(:name => params[:name]) head :no_content end #routes: post '/delete_latest_name' => 'something#delete_by_name' #JS# function deleteSomething(name){ return fetch(`delete_latest_name`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: name }) }); } 
    Intereting Posts