2013-06-12 8 views
22

Zajmuję się REST api w oparciu o szyny. Aby użyć tego interfejsu API, MUSISZ być zalogowany. W związku z tym chciałbym utworzyć w moim kontrolerze użytkownika metodę me, która zwróci jsonowi zalogowanego użytkownika. Nie muszę więc podawać adresu URL w postaci :id. Chcę po prostu zadzwonić http://domain.com/api/users/meTrasy Railsów: GET bez parametrów: id

Więc próbowałem to:

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 

Jak widać, moja droga czeka na identyfikatorze, ale chciałbym dostać coś Devise ma. Coś opartego na identyfikatorze current_user. Przykład poniżej:

edit_user_password GET /users/password/edit(.:format)   devise/passwords#edit 

W tym przykładzie można edytować aktualne hasło użytkownika bez przechodzenia id jako param.

mogę użyć kolekcję zamiast członka, ale to brudny obwodnicy ...

Ktoś ma pomysł? Dziękuję

Odpowiedz

14

trasy zasobów są przeznaczone do pracy w ten sposób. Jeśli chcesz czegoś innego, zaprojektuj to sam, w ten sposób.

match 'users/me' => 'users#me', :via => :get 

Umieścić go spoza bloku resources :users

+0

Brilliant Arjan. Dokładnie to, czego potrzebowałem ... z tym wyjątkiem, że nie będę miał ścieżki, ale bez niej będę mógł. Twoje zdrowie. – Gozup

+0

Nie ma problemu, możesz dodać ścieżkę, dodając: ': as => 'me''. Spowoduje to dodanie 'me_path' i' me_url'. – Arjan

+0

Świetnie. Tego nie wiedziałem. Dzięki – Gozup

6

Może ja czegoś brakuje, ale dlaczego nie użyć:

get 'me', on: :collection 
+0

to co Nie jest to miła praca, ponieważ kolekcja jest zbiorem wielu obiektów .Prosimy o current_user, więc 1 obiekt, więc członek ;-) – Gozup

+0

Semantycznie źle, mój przyjacielu – barbolo

0

Podczas tworzenia trasy zagnieżdżony wewnątrz zasobu, można wspomnieć, czy jest to działanie członek lub zbiór akcja.

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 
... 
... 
+0

To właśnie ja Powiedziałem w mojej konkluzji.Nie jest miło pracować, ponieważ kolekcja jest tablicą wielu obiektów.Prosimy o current_user, więc 1 obiekt, więc mem ber ;-) – Gozup

63

Sposób, aby przejść jest użycie singular resources:

Więc zamiast resources użytkowania resource:

Czasami masz zasób, który klienci zawsze sprawdzają bez odwoływania się do identyfikatora. Na przykład chcesz/profil, aby zawsze wyświetlać profil aktualnie zalogowanego użytkownika. W tym przypadku można użyć liczby pojedynczej do zasobu map/profile (zamiast/profile /: id) do akcji show [...]

Więc w twoim przypadku:

resource :user do 
    get :me, on: :member 
end 

# => me_api_user GET /api/users/me(.:format)   api/v1/users#me {:format=>"json"} 
+1

Świetnie, to właśnie uczyniło mój plik trasy znacznie prostszym. –

+2

To powinno zostać zaakceptowane. Chociaż 'get 'users/me' => 'users # me'' działa wystarczająco dobrze, grupowanie ich jako pojedynczego zasobu jest czystszym podejściem. – Orlando

+1

powinna być zaakceptowaną odpowiedzią. – qbantek

5
resources :users, only: [:index, :update] do 
    collection do 
     get :me, action: 'show' 
    end 
    end 

określenie działania jest opcjonalne. możesz pominąć tutaj akcję i nazwać działanie kontrolera jako me.

4

Można użyć

resources :users, :only => [:index, :update] do 
    get :me, on: :collection 
end 

lub

resources :users, :only => [:index, :update] do 
    collection do 
    get :me 
    end 
end 

„Trasa członkiem wymaga identyfikatora, ponieważ działa na członka. Trasa kolekcja nie robi, ponieważ działa na zbiorze obiektów.Podgląd jest przykładem trasy elementu, ponieważ działa na (i wyświetla) pojedynczy obiekt. Wyszukiwanie jest przykładem trasy zbiórki, ponieważ działa na (i wyświetlacze) zbiór obiektów.”(Z here)

0

To daje taki sam wynik jak Arjan jest w prostszy sposób

get 'users/me', to: 'users#me'