46

Rails に基づいて REST API を開発しています。meこの API を使用するには、ログインする必要があります。それに関して、ログインしたユーザー情報の json を返すメソッドをユーザー コントローラーに作成したいと思います。:idしたがって、 URL で渡す必要はありません。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_userIDに基づくもの。以下の例:

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

この例では、id をパラメーターとして渡さずに現在のユーザー パスワードを編集できます。

メンバーの代わりにコレクションを使用することもできますが、それはダーティ バイパスです...

誰にもアイデアがありますか?ありがとうございました

4

7 に答える 7

116

行く方法は、単一のリソースを使用することです:

したがって、resources使用する代わりにresource:

クライアントが常に ID を参照せずに検索するリソースがある場合があります。たとえば、現在ログインしているユーザーのプロファイルを常に /profile に表示したいとします。この場合、単一のリソースを使用して、(/profile/:id ではなく) /profile を show アクションにマップすることができます [...]

だから、あなたの場合:

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

# => me_api_user GET    /api/users/me(.:format)            api/v1/users#me {:format=>"json"}
于 2014-09-03T10:38:38.383 に答える
19

使用できます

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

また

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

「メンバー ルートは、メンバーに作用するため、ID が必要です。コレクション ルートは、オブジェクトのコレクションに作用するため、必要ありません。プレビューは、単一のオブジェクトに作用 (および表示) するため、メンバー ルートの例です。オブジェクト. 検索は、オブジェクトのコレクションに作用する (および表示する) ため、コレクション ルートの例です。" (ここから)

于 2015-10-09T14:49:24.083 に答える
13

多分私は何かが欠けているかもしれませんが、なぜあなたは使わないのですか:

get 'me', on: :collection
于 2013-06-12T13:28:16.150 に答える
7
  resources :users, only: [:index, :update] do
    collection do
      get :me, action: 'show' 
    end
  end

アクションの指定はオプションです。ここでアクションをスキップして、コントローラー アクションにme.

于 2015-09-22T10:58:53.347 に答える