ruby on rails - rails - Rutas de carriles: GET sin param: id.
routes rails examples (7)
Cuando creas una ruta anidada dentro de un recurso, puedes mencionar, ya sea una acción de miembro o una acción de colección.
namespace :api, defaults: { format: ''json'' } do
scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
resources :tokens, :only => [:create, :destroy]
resources :users, :only => [:index, :update] do
# I tried this
match ''me'', :via => :get, :collection => true
...
...
Estoy desarrollando una API REST basada en rieles. Para usar esta API, DEBES haber iniciado sesión. Al respecto, me gustaría crear un método en mi controlador de usuario que devuelva un json de las informaciones de usuarios registrados. Entonces, no necesito un :id
para ser pasado en la URL. Solo quiero llamar a http://domain.com/api/users/me
Así que intenté esto:
namespace :api, defaults: { format: ''json'' } do
scope module: :v1, constraints: ApiConstraints.new(version: 1, default: true) do
resources :tokens, :only => [:create, :destroy]
resources :users, :only => [:index, :update] do
# I tried this
match ''me'', :via => :get
# => api_user_me GET /api/users/:user_id/me(.:format) api/v1/users#me {:format=>"json"}
# Then I tried this
member do
get ''me''
end
# => me_api_user GET /api/users/:id/me(.:format) api/v1/users#me {:format=>"json"}
end
end
end
Como puede ver, mi ruta espera una identificación, pero me gustaría obtener algo como el dispositivo. Algo basado en la identificación current_user
. Ejemplo a continuación:
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
En este ejemplo, puede editar la contraseña de usuario actual sin pasar el ID como parámetro.
Podría usar una colección en lugar de un miembro, pero eso es un bypass sucio ...
Alguien tiene una idea? Gracias
El camino a seguir es utilizar recursos singulares :
Entonces, en lugar de los resources
use el resource
:
A veces, tiene un recurso que los clientes siempre buscan sin hacer referencia a una ID. Por ejemplo, le gustaría que / perfil siempre muestre el perfil del usuario que ha iniciado sesión actualmente. En este caso, puede usar un recurso singular para mapear / perfil (en lugar de / profile /: id) para mostrar la acción [...]
Así, en tu caso:
resource :user do
get :me, on: :member
end
# => me_api_user GET /api/users/me(.:format) api/v1/users#me {:format=>"json"}
Esto da el mismo resultado que Arjan en forma más simple.
get ''users/me'', to: ''users#me''
Las rutas de recursos están diseñadas para funcionar de esta manera. Si quieres algo diferente, diseñalo tú mismo, así.
match ''users/me'' => ''users#me'', :via => :get
Ponlo fuera de tus resources :users
bloque de resources :users
Puedes usar
resources :users, only: [:index, :update] do
get :me, on: :collection
end
o
resources :users, only: [:index, :update] do
collection do
get :me
end
end
"Una ruta de miembro requerirá una ID, porque actúa sobre un miembro. Una ruta de colección no porque actúa sobre una colección de objetos. Vista previa es un ejemplo de una ruta de miembro, porque actúa (y muestra) una sola La búsqueda es un ejemplo de una ruta de colección, porque actúa (y muestra) una colección de objetos ". (desde here )
Tal vez me esté perdiendo algo, pero ¿por qué no usas:
get ''me'', on: :collection
resources :users, only: [:index, :update] do
collection do
get :me, action: ''show''
end
end
Especificar la acción es opcional. Puedes omitir la acción aquí y nombrar la acción de tu controlador como me
.