Railsに基づくREST apiを開発しています。このapiを使用するには、ログインする必要があります。それに関して、ユーザーのメソッドme
を作成したいと思います。ログインしたユーザー情報のJSONを返すコントローラーです。したがって、URLに:id
を渡す必要はありません。 http://domain.com/ api/users/me
だから私はこれを試しました:
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を待ちますが、deviseが持っているようなものを取得したいと思います。 current_user
idに基づくもの。以下の例:
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
この例では、IDをパラメーターとして渡さずに現在のユーザーパスワードを編集できます。
メンバーの代わりにコレクションを使用することもできますが、それは汚いバイパスです...
誰もがアイデアを持っていますか?ありがとうございました
リソースルートは、このように機能するように設計されています。別の何かが必要な場合は、このように自分で設計します。
match 'users/me' => 'users#me', :via => :get
resources :users
ブロックの外側に配置します
行く方法は singular resources を使用することです:
したがって、resources
の代わりにresource
を使用します。
場合によっては、クライアントがIDを参照せずに常に検索するリソースがあります。たとえば、/ profileに、現在ログインしているユーザーのプロファイルを常に表示したい場合があります。この場合、単一のリソースを使用して/ profile(/ profile /:idではなく)をshowアクションにマッピングできます[...]
だから、あなたの場合:
resource :user do
get :me, on: :member
end
# => me_api_user GET /api/users/me(.:format) api/v1/users#me {:format=>"json"}
たぶん私は何かを見逃していますが、なぜあなたは使用しないのですか:
get 'me', on: :collection
使用できます
resources :users, only: [:index, :update] do
get :me, on: :collection
end
または
resources :users, only: [:index, :update] do
collection do
get :me
end
end
「メンバールートはメンバーに作用するため、IDが必要です。コレクションルートは、オブジェクトのコレクションに作用するためではありません。プレビューは、単一に作用(および表示)するため、メンバールートの例です。オブジェクト。検索はオブジェクトのコレクションに作用(および表示)するため、コレクションルートの例です。」 (from here )
resources :users, only: [:index, :update] do
collection do
get :me, action: 'show'
end
end
アクションの指定はオプションです。ここでアクションをスキップし、コントローラーアクションにme
という名前を付けることができます。
これにより、Arjanと同じ結果がより簡単に得られます。
get 'users/me', to: 'users#me'
リソース内にネストされたルートを作成する場合、メンバーアクションかコレクションアクションかを言及できます。
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
...
...