Rails de voies: OBTENEZ sans param :id
Je suis le développement d'une api REST basé sur des rails. Pour utiliser cette api, vous DEVEZ être connecté. À ce propos, j'aimerais créer une méthode me
dans mon contrôleur utilisateur qui sera de retour json de l'utilisateur connecté infos.
Donc, je n'ai pas besoin d'un :id
être passé dans l'URL. Je veux juste appeler http://domain.com/api/users/me
J'ai donc essayé ceci:
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
Comme vous pouvez le voir, mon itinéraire attend un id, mais je voudrais obtenir quelque chose comme a concevoir. Quelque chose basé sur current_user
id. L'exemple ci-dessous:
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
Dans cet exemple, vous pouvez modifier le mot de passe courant sans passer l'id comme un param.
Que je pouvais utiliser une collection à la place d'un membre, mais c'est un sale bypass...
Quelqu'un a une idée?
Merci
Vous devez vous connecter pour publier un commentaire.
Itinéraires des ressources sont conçues pour fonctionner de cette façon. Si vous voulez quelque chose de différent, à la conception elle-même, comme ceci.
Le mettre à l'extérieur de votre
resources :users
bloc:as => 'me'
. Cela va ajouterme_path
etme_url
.La voie à suivre consiste à utiliser singulier ressources:
Ainsi, au lieu de
resources
utilisationresource
:Donc, dans votre cas:
get 'users/me' => 'users#me'
fonctionne assez bien, de les regrouper sous forme d'une unique ressource est un nettoyant approche.resources
, puis en les ajoutant à lacollection
serait mieux (comme certains des autres réponses ont souligné). L'ajout d'une unique ressource va fonctionner, mais je pense qu'il serait plus logique et plus lisible pour tout garder ensemblePeut-être que je manque quelque chose, mais pourquoi n'utilisez-vous pas:
spécifiant l'action est facultative. vous pouvez ignorer l'action ici et le nom de votre contrôleur de l'action comme
me
.Vous pouvez utiliser
ou
"Un membre itinéraire besoin d'un ID, parce qu'il agit sur un membre. Un itinéraire de collecte n'est pas parce qu'il agit sur une collection d'objets. L'aperçu est un exemple d'un membre de l'itinéraire, car il agit sur (et affiche) un objet unique. La recherche est un exemple d'un itinéraire de collecte, car il agit sur (et affiche) une collection d'objets." (à partir de ici)
Cela donne le même résultat que Arjan est dans le plus simple
get 'users/me', to: 'users#me'
Lorsque vous créez un itinéraire imbriquée à l'intérieur d'une ressource, vous pouvez mentionner, s'il est membre d'action ou une action de collecte.