web-dev-qa-db-ja.com

Rails routes:paramなしのGET:id

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をパラメーターとして渡さずに現在のユーザーパスワードを編集できます。

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

誰もがアイデアを持っていますか?ありがとうございました

35
Gozup

リソースルートは、このように機能するように設計されています。別の何かが必要な場合は、このように自分で設計します。

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

resources :usersブロックの外側に配置します

18
Arjan

行く方法は 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"}
84

たぶん私は何かを見逃していますが、なぜあなたは使用しないのですか:

get 'me', on: :collection
10
EfratBlaier

使用できます

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

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

アクションの指定はオプションです。ここでアクションをスキップし、コントローラーアクションにmeという名前を付けることができます。

7
manohar

これにより、Arjanと同じ結果がより簡単に得られます。

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

2
Raf

リソース内にネストされたルートを作成する場合、メンバーアクションかコレクションアクションかを言及できます。

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
manoj