Elixir 多个控制器上的干复制代码

Elixir 多个控制器上的干复制代码,elixir,phoenix-framework,Elixir,Phoenix Framework,我在/users/:user_id/…下有几个嵌套路由,其中的控制器需要用户。在所有这些控制器中,我有以下代码。但我不想在所有这些控制器中都有相同的代码,而只是在一个地方。应该把它放在哪里?我怎样才能把它擦干 defmodule MyApp.XyzController do 使用MyApp.Web,:controller 插件:分配用户 [...] defp分配用户(连接,选择)do 凯斯康涅狄格州 %{“用户id”=>用户id}-> case Repo.get(MyApp.User,User_

我在
/users/:user_id/…
下有几个嵌套路由,其中的控制器需要
用户
。在所有这些控制器中,我有以下代码。但我不想在所有这些控制器中都有相同的代码,而只是在一个地方。应该把它放在哪里?我怎样才能把它擦干

defmodule MyApp.XyzController do
使用MyApp.Web,:controller
插件:分配用户
[...]
defp分配用户(连接,选择)do
凯斯康涅狄格州
%{“用户id”=>用户id}->
case Repo.get(MyApp.User,User_id)do
无->无效用户(连接)
用户->分配(连接:用户,用户)
结束
_->无效的用户(conn)
结束
结束
defp无效用户(conn)do
康涅狄格州
|>put_闪存(:错误,“无效用户!”)
|>重定向(到:页面路径(连接:索引))
|>停止
结束
结束

您应该为此创建一个插头。我通常把它放在
lib/plugs/
web/plugs/
中,文件名与模块的最后一节相同(例如,对于这个插件,
fetch\u user.ex

类似于(未经测试):

defmodule MyApp.Plugs.FetchUser do
进口插头
别名MyApp.Repo
def init(u)do
无
结束
def呼叫(连接,选择)do
凯斯康涅狄格州
%{“用户id”=>用户id}->
case Repo.get(MyApp.User,User_id)do
无->无效用户(连接)
用户->分配(连接:用户,用户)
结束
_->无效的用户(conn)
结束
结束
defp无效用户(conn)do
康涅狄格州
|>put_闪存(:错误,“无效用户!”)
|>重定向(到:页面路径(连接:索引))
|>停止
结束
结束
然后在控制器中写入:

plug MyApp.Plugs.FetchUser