shallow rails namespace examples concern ruby-on-rails ruby ruby-on-rails-3.2 routes

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 .