8

私は次のようにレールにAPIルートのセットを持っています

namespace "api" do
   namespace "v1" do
     resources :users do
       resources :posts
       resources :likes
       ...
     end
   end
end

ここまでは順調ですね。/ api / v1 / users / fred_flintstoneを取得して、そのユーザーのすべての情報を取得できます。

私が今やりたいのは、「私」(ala facebook)の概念を追加して、ユーザーが認証された場合(fred_flintstone)、次のこともできるようにすることです。

GET / api / v1 / me

/ api / v1 / me/postsを取得

..。

両方のルートセットが必要です。したがって、GET / api / v1 / me/postsまたはGET/api / v1 / users / fred_flintstone/postsのいずれかを使用して同じ結果を達成したいと思います。

私はルートチュートリアルを経験し、グーグルで検索したので、ポインターは直接の答えと同じくらい高く評価されます。

編集:

私がやったことはうまくいきましたが、かなりハッキーです。スコープを使用して、routesテーブルに2番目のエントリセットを作成しました。

scope "/api/v1/me", :defaults => {:format => 'json'}, :as => 'me' do
  resources :posts, :controller => 'api/v1/users/posts'
  resources :likes, :controller => 'api/v1/users/likes'
  ...
end

次に、params [:user_id]の存在をテストするset_userメソッドを追加しました。私はこれを乾かす方法を本当に探しています。

4

1 に答える 1

5

ルートを投稿の状態のままにして、コントローラー内でこれを解決するのはどうですか?

これは、からプルbefore_filterするすべてのルートに適用できるものです。User:user_id

# Set the @user variable from the current url; 
# Either by looking up params[:user_id] or
# by assigning current_user if params[:user_id] = 'me'
def user_from_user_id
  if params[:user_id] == 'me' && current_user
    @user = current_user
  else
    @user = User.find_by_user_id params[:user_id]
  end

  raise ActiveRecord::RecordNotFound unless @user
end

次に、コントローラー関数で、ユーザーが、、または@userを渡したかどうかを気にすることなく、変数を使用できます。 user_idme

お役に立てば幸いです。:)

編集:

あなたのコメントを踏まえて、レムは別のショットを撮ります。

標準ルートとルートの両方を介してアクセスしたいすべてのリソースを一覧表示する関数はどうですか/me。次に、必要な両方の名前空間で関数を使用できます。

ルート.rb

# Resources for users, and for "/me/resource"
def user_resources
  resources :posts
  resources :likes
  ...
end

namespace 'api' do
   namespace 'v1' do
     resources :users do
       user_resources
     end
   end
end

scope '/api/v1/:user_id', :constraints => { :user_id => 'me' },
                          :defaults => {:format => 'json'}, :as => 'me' do
  user_resources
end

# We're still missing the plain "/me" route, for getting
# and updating, so hand code those in
match '/api/v1/:id' => 'users#show', :via => :get,
                                     :constraints => { :id => 'me' }                
match '/api/v1/:id' => 'users#update', :via => :put,
                                       :constraints => { :id => 'me' }
于 2012-04-14T04:37:16.007 に答える