2013-06-12 32 views
22

Tôi đang phát triển một REST api dựa trên đường ray. Để sử dụng api này, bạn PHẢI được đăng nhập. Về điều đó, tôi muốn tạo một phương thức me trong bộ điều khiển người dùng của tôi sẽ trả về một json của các thông tin người dùng đã đăng nhập. Vì vậy, tôi không cần số :id để được chuyển vào URL. Tôi chỉ muốn gọi http://domain.com/api/users/meTuyến đường ray: GET mà không có thông số: id

Vì vậy, tôi cố gắng này:

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 

Như bạn có thể thấy, con đường tôi chờ đợi một id, nhưng tôi muốn để có được một cái gì đó giống như devise có. Một cái gì đó dựa trên id current_user. Ví dụ bên dưới:

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

Trong ví dụ này bạn có thể chỉnh sửa mật khẩu người dùng hiện tại mà không chuyển id làm thông số.

Tôi có thể sử dụng bộ sưu tập thay vì thành viên, nhưng đó là một bộ phận bỏ qua ...

Có ai có ý tưởng không? Cảm ơn bạn

Trả lời

14

Các tuyến tài nguyên được thiết kế để hoạt động theo cách này. Nếu bạn muốn một cái gì đó khác nhau, thiết kế nó cho mình, như thế này.

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

Đặt nó bên ngoài của resources :users khối của bạn

+0

Rực rỡ Arjan. Chính xác những gì tôi cần ... ngoại trừ việc tôi sẽ không có con đường nhưng tôi có thể làm mà không có nó. Chúc mừng. – Gozup

+0

Không sao, bạn có thể thêm đường dẫn bằng cách thêm ': as => 'me''. Điều này sẽ thêm 'me_path' và' me_url'. – Arjan

+0

Tuyệt vời. Không biết điều đó. Cảm ơn – Gozup

6

lẽ tôi đang thiếu một cái gì đó, nhưng tại sao bạn không sử dụng:

get 'me', on: :collection 
+0

Đó là những gì Tôi nói trong kết luận của tôi.Đó không phải là một công việc tốt đẹp xung quanh kể từ khi một bộ sưu tập là một mảng của nhiều đối tượng.Tôi đang yêu cầu current_user, vì vậy 1 đối tượng, do đó, một thành viên ;-) – Gozup

+0

Semantically sai, người bạn của tôi – barbolo

0

Khi bạn tạo một con đường lồng trong một tài nguyên, bạn có thể đề cập đến, cho dù đó là thành viên hành động hoặc một bộ sưu tập hoạt động.

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

Đó là những gì tôi Tôi đã hỏi về current_user, vì vậy 1 đối tượng ber ;-) – Gozup

63

Cách để đi là sử dụng singular resources:

Vì vậy, thay vì resources sử dụng resource:

Đôi khi, bạn có một tài nguyên mà khách hàng luôn tra cứu mà không cần tham chiếu ID. Ví dụ: bạn muốn/hồ sơ luôn hiển thị hồ sơ của người dùng hiện đã đăng nhập. Trong trường hợp này, bạn có thể sử dụng một nguồn lực đặc biệt để lập bản đồ/hồ sơ (chứ không phải/profile /: id) để chương trình hành động [...]

Vì vậy, trong trường hợp của bạn:

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

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

Tuyệt vời, điều này chỉ làm cho tệp tuyến đường của tôi đơn giản hơn rất nhiều. –

+2

Điều này sẽ được chấp nhận. Trong khi 'get 'users/me' => 'người dùng # me'' hoạt động đủ tốt, nhóm chúng lại thành một nguồn tài nguyên số ít là một cách tiếp cận rõ ràng hơn. – Orlando

+1

phải là câu trả lời được chấp nhận – qbantek

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

chỉ định tác vụ là tùy chọn. bạn có thể bỏ qua hành động ở đây và đặt tên cho hành động của bộ điều khiển là me.

4

Bạn có thể sử dụng

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

hoặc

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

"Một con đường thành viên sẽ yêu cầu một ID, bởi vì nó hoạt động trên một thành viên. Một tuyến đường bộ sưu tập không vì nó hoạt động trên một bộ sưu tập đối tượng.Xem trước là một ví dụ về một tuyến đường thành viên, bởi vì nó hoạt động trên (và hiển thị) một đối tượng duy nhất. Tìm kiếm là một ví dụ của một tuyến đường bộ sưu tập, bởi vì nó hoạt động trên (và hiển thị) một bộ sưu tập của các đối tượng."(Từ here)

0

này cho kết quả tương tự như Arjan trong cách đơn giản hơn

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

Các vấn đề liên quan