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

Elixir 使用范围部分中多个模块的控制器,elixir,phoenix-framework,Elixir,Phoenix Framework,我正在尝试使用shield构建一个Oauth2服务器(称为Oauth2srv)。但这不是问题所在。示例代码基本上说明了如何执行此操作: scope "/", Shield do pipe_through :api get "/apps", AppController, :index .. etcetera .. end 屏蔽模块位于依赖项中,因此驻留在deps/Shield中。所有的路线都在那里。 现在,我想在我自己的模块中向控制器添加一条路由,如下所示: scope "/",

我正在尝试使用shield构建一个Oauth2服务器(称为Oauth2srv)。但这不是问题所在。示例代码基本上说明了如何执行此操作:

scope "/", Shield do
  pipe_through :api

  get "/apps", AppController, :index
  .. etcetera ..
end
屏蔽模块位于依赖项中,因此驻留在deps/Shield中。所有的路线都在那里。 现在,我想在我自己的模块中向控制器添加一条路由,如下所示:

scope "/", Shield do
  pipe_through :api

  get "/apps", AppController, :index
  get "/*", Oauth2srv.CatchallController, :catch_it
end
catchall控制器位于web/controllers/catchall_controller.ex中。但是作用域似乎期望所有控制器都在同一目录中,编译器向我抛出一个错误:
function Shield.Oauth2srv.CatchallController.init/1未定义


我需要做什么?

最可能的情况是,您需要使用不同的作用域。你什么时候做的

scope "/", Shield do
  get "/apps", AppController, :index
end
您的意思是您有一个名为
Shield.AppController
的模块,因此当您在
Shield
范围内添加catch-all路由时,您告诉编译器您有一个
Shield.catch-allcontroller
模块

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

如果这些是您在应用程序中定义的仅有的两条路由,那么您可以执行以下操作

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
如果有更多,可能需要指定多个作用域。差不多

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

请注意“作用域似乎希望所有控制器都在同一目录中”。这不是长生不老药的工作原理。Elixir是一种编译语言。因此,从技术上讲,您可以将模块放在任何目录中,不管名称如何。不过,为了方便查找模块,通常将目录结构置于模块名称之后是很有用的。谢谢您的回答。事实证明,我并不真正理解范围动词的作用。它是一个函数吗?从未接触过Ruby,因此仍然无法识别没有括号的函数。那么,我是否正确理解作用域是一个采用路径前缀的函数,一个告诉它将该作用域作为所有控制器名称前缀的作用域名称,以及一个将路由添加到全局路由列表的函数?是一个宏。你还提到不要碰红宝石,长生不老药和红宝石很不一样。如果你试图直接比较这两者,你会对自己和其他人造成伤害。我不是在比较,我的评论集中在遇到在Elixir中没有括号的函数,这是我第一次看到,每次都让我感到困惑。谷歌搜索让我相信这是Ruby中首次广泛使用的,而设计Elixir的那个人是Ruby的长期开发者。