2013-06-12 153 views
22

我正在開發基於Rails的REST api。要使用這個api,你必須登錄。對此,我想在我的用戶控制器中創建一個方法me,它將返回登錄用戶信息的json。 因此,我不需要在URL中傳遞:id。我只是想打電話給http://domain.com/api/users/meRails路由:GET不帶參數:id

所以,我想這一點:

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 

正如你可以看到,我的路線等待一個id,但我想獲得類似色器件了。基於current_user id的東西。下面的例子:

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

在這個例子中,你可以不通過ID作爲PARAM編輯當前用戶的密碼。

我可以使用一個集合,而不是一個成員的,但是這是一個骯髒的旁路...

任何人有一個想法? 謝謝

回答

14

資源路徑被設計成以這種方式工作。如果你想要不同的東西,請自己設計一下,就像這樣。

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

把它放在你的resources :users塊外

+0

輝煌的阿爾詹。確切地說,我需要......除了我不會有道路,但我可以沒有它。乾杯。 – Gozup

+0

沒問題,你可以通過添加':as =>'me''來添加路徑。這將添加'me_path'和'me_url'。 – Arjan

+0

太好了。不知道。謝謝 – Gozup

6

也許我失去了一些東西,但你爲什麼不使用:

get 'me', on: :collection 
+0

我在我的結論中說,這不是一個很好的工作,因爲一個集合是一個多個對象的數組,我要求current_user,所以1個對象,所以成員;-) – Gozup

+0

語義錯誤,我的朋友 – barbolo

0

當您創建一個嵌套的資源內的路線,那麼你可以說,無論是成員的行動或集合行動。

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

這就是我在我的結論中說,這不是一個很好的解決方法,因爲集合是一個多個對象的數組,所以我要求current_user,所以1個對象,所以一個mem ber ;-) – Gozup

63

去的方式是使用singular resources

所以,相反的resources使用resource

有時候,你有客戶始終查找資源而不引用ID。例如,您希望/ profile始終顯示當前登錄用戶的配置文件。在這種情況下,你可以使用一個單一的資源映射/配置文件(而不是/資料/:ID)的演出行動[...]

所以,你的情況:

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

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

偉大的,這只是讓我的路線文件更簡單。 –

+2

這應該被接受。儘管'get'users/me'=>'users#me''可以很好地工作,但將它們分組爲單一資源是一種更簡潔的方法。 – Orlando

+1

應該是被接受的答案 – qbantek

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

指定該操作是可選的。你可以跳過這裏的動作並將你的控制器動作命名爲me

4

您可以使用

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

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

「的成員路線將需要一個ID,因爲它作爲一個部件上。集合路線不會因爲它作用於集合的物體。預覽是成員路由的一個示例,因爲它作用於(並顯示)單個對象。搜索是一家集路徑的一個例子,因爲它作用於(和顯示器)對象的集合。」(來自here

0

這給了相同的結果,阿爾揚在這就是簡單的方法

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