使用范围部分中多个模块的控制器

时间:2017-02-08 21:08:03

标签: elixir phoenix-framework

我正在尝试使用shield构建一个Oauth2服务器(称为Oauth2srv)。但这不是问题所在。示例代码基本上是这样说的:

scope "/", Shield do
  pipe_through :api

  get "/apps", AppController, :index
  .. etcetera ..
end

Shield模块处于依赖关系中,因此驻留在deps / shield中。所有路线也都在那里。 现在我想在我自己的模块中添加一个到控制器的路径,如下所示:

scope "/", Shield do
  pipe_through :api

  get "/apps", AppController, :index
  get "/*", Oauth2srv.CatchallController, :catch_it
end

CatchallController位于web / controllers / catchall_controller.ex中。但是范围似乎期望同一目录中的所有控制器,并且编译器会抛出一个错误:function Shield.Oauth2srv.CatchallController.init/1 is undefined

我需要做什么?

1 个答案:

答案 0 :(得分:1)

最有可能的是,您需要使用不同的范围。当你做了

scope "/", Shield do
  get "/apps", AppController, :index
end

你说你有一个名为Shield.AppController的模块,所以当你在Shield范围内添加catch all路径时,你告诉编译器你有一个Shield.CatchallController模块。

但是,根据您的错误,编译器正在寻找Shield.Oauth2srv.CatchallController(请注意Oauth2srv)。所以你要么没有提供所有信息,要么就会发生其他事情。

如果这些是您在应用程序中定义的唯一2条路线,则可以执行类似

的操作
scope "/" do
  get "/apps", Shield.AppController, :index
  get "/*", MyApp.CatchallController, :catch_it
end

如果您有更多,则可能需要指定多个范围。像

这样的东西
scope "/", Shield do
  get "/apps", AppController, :index
  get "/something_else, OtherController, :foo
  ...
end

scope "/", MyApp do
  get "/*", CatchallController, :catch_it

  # Other routes that are important to your application
  ...
end