Estoy tratando de crear un botón que convierta a un usuario determinado en administrador. Para eso me gustaría crear una ruta para la solicitud post /users/:id/admin. Para hacer eso, estoy tratando de crear un recurso anidado así:

resources "/users", UserController, only: [:new, :create, :index] do
  resources "/admin", UserController, only: [:post]
end

Pero cuando ejecuto mix phx.routes | grep users, solo obtengo esas rutas:

user_path  GET     /users            StorexWeb.UserController :index
user_path  GET     /users/new        StorexWeb.UserController :new
user_path  POST    /users            StorexWeb.UserController :create

Como si el recurso anidado no fuera declarado. ¿Qué tiene de malo mi declaración de recursos? y como puedo arreglarlo?

1
David B. 20 ene. 2018 a las 20:20

3 respuestas

La mejor respuesta

El problema está en only: [:post]. No existe tal acción :post, por lo que terminas sin nada. Probablemente quisiste esto:

resources "/users", UserController, only: [:new, :create, :index] do
  resources "/admin", UserController, only: [:create]
end

Abriré una cuestión en Phoenix para plantear en esos casos para evitar más confusión.

5
José Valim 20 ene. 2018 a las 22:07

Para este escenario, prefiero usar post / get directamente en lugar de usar resources porque no estoy obligado a usar un nombre de función específico como create, especialmente si el controlador de su El recurso anidado solo tiene un punto final / función (por ejemplo, /users/admin con post).

resources "/users", UserController, only: [:new, :create, :index] do
  post "/admin", UserController, :post
end
0
Tom 22 ene. 2018 a las 08:56

Con recursos anidados, eso no sería un resource, sino un scope. Lo siguiente debería funcionar:

scope "/users" do
  resources "/", UserController, only: [:new, :create, :index]

  resources "/admin", UserController, only: [:post]
end
0
Aleksei Matiushkin 20 ene. 2018 a las 17:57