4

コントローラ用のモジュールを作成し、コントローラ内のそのモジュールを指すルートを取得するのに問題があります。

このエラーの取得:

Routing Error
uninitialized constant Api::Fb

だから、これは私のルートが設定されている方法です:

namespace :api do
  namespace :fb do
    post :login
    resources :my_lists do
      resources :my_wishes
    end
  end
end

私のfb_controllerには、次のようなパスを提供するモジュールを含めたいと思います。

/api/fb/my_lists

これは私のfb_controllerの一部です:

class Api::FbController < ApplicationController
  skip_before_filter :authenticate_user!, :only => [:login]

  include MyLists # <-- This is where i want to include the /my_lists
                  # namespace(currently not working, and gives me error 
                  # mentioned above)

  def login
    #loads of logic
  end
end

MyLists.rbファイル(モジュールを定義する場所)は、fb_controller.rbと同じディレクトリにあります。

/ api / fb / my_listsのように、名前空間がfb_controller内のモジュールを指すようにするにはどうすればよいですか?

4

2 に答える 2

10

設定した名前空間は、次のようなコントローラー クラスを探しています。

class Api::Fb::MyListsController

次のようなルートが必要だが、 の代わりに を/api/fb/my_lists使用したい場合は、ルートを次のように設定する必要があります。FbControllerMyListsController

namespace :api do
  scope "/fb" do
    resources :my_lists, :controller => 'fb'
  end
end

私の意見では、モジュールを含める代わりに、MyListsちょっとFbControllerぎこちないようです。

私がおそらく行うことはFB、汎用の FbController を備えたモジュールを用意し、次に を用意することMyListsController < FbControllerです。とにかく、これはあなたの質問の範囲を超えています。

上記はあなたのニーズに答えるはずです。

編集

あなたのコメントと、あなたがやろうとしていることについての私の仮定から、これは小さな例です:

config/routes.rb

namespace :api do
  scope "/fb" do
    post "login" => "fb#login"
    # some fb controller specific routes
    resources :my_lists
  end
end

api/fb/fb_controller.rb

class Api::FbController < ApiController
  # some facebook specific logic like authorization and such.
  def login
  end
end

api/fb/my_lists_controller.rb

class Api::MyListsController < Api::FbController
  def create
    # Here the controller should gather the parameters and call the model's create
  end
end

ここで、オブジェクトを作成したいMyListだけなら、ロジックをモデルに直接実行できます。一方、さらにロジックを処理したい場合は、MyList とそれに関連付けられたウィッシュまたはMyListモデルの作成を処理するサービス オブジェクトにそのロジックを配置します。私はおそらくサービスオブジェクトに行きます。サービス オブジェクトはモジュールではなくクラスである必要があることに注意してください。

于 2013-03-20T18:40:02.907 に答える
1

あなたの例では、Fbは名前空間ではなく、コントローラーです。Fb名前空間の呼び出しにより、アプリは存在しないモジュールを探すように強制されます。次のようにルートを設定してみてください。

namespace :api do
  resource :fb do
    post :login
    resources :my_lists do
      resources :my_wishes
    end
  end
end

オプションで、API名前空間の新しいベースコントローラーを定義できます。

# app/controllers/api/base_controller.rb
class Api::BaseController < ApplicationController
end

そうすると、他のコントローラーはこれを継承できます。

# app/controllers/api/fb_controller.rb
class Api::FbController < Api::BaseController
end

実行rake routesすると、他のコントローラーがどのように配置されているかがわかります。警告です。通常、リソースを1つ以上の深さでネストすることはお勧めしません(最終的にはのような複雑なパスになりますedit_api_fb_my_list_my_wish_path)。これをより簡単な方法で設計できれば、おそらくこれをより簡単に行うことができます。

于 2013-03-20T18:43:30.450 に答える