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 位于同一目录中。

如何让命名空间指向 fb_controller 内部的模块,例如 /api/fb/my_lists ?

4

2 回答 2

10

您设置的命名空间正在寻找一个看起来像这样的控制器类

class Api::Fb::MyListsController

如果你想要一个看起来像的路线,/api/fb/my_lists但你仍然想使用FbController而不是MyListsController你需要设置你的路线看起来像这样

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

在我看来,而不是MyLists在你的模块中包含一个模块FbController似乎有点尴尬。

我可能会做的是有一个FB带有通用 FbController 的模块,然后有MyListsController < FbController. 无论如何,这超出了您的问题范围。

以上应该可以满足您的需求。

编辑

根据您的评论,以及我对您正在尝试执行的操作的假设,这是一个小例子:

配置/路由.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 及其关联的 Wishes 或您的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 回答