目前我有一个角色插件,如下所示:
plug Roles, :role
它接收作为第二个参数的特定角色和当前用户从正在使用的当前令牌中获取。我以这种方式使用控制器模块内部的插头:
plug Roles, :manage_users when action in [:index, :show, :delete]
这样做的问题是我想将所有这些逻辑移动到router.ex
,以明确控制器的配置是什么。
从文档中,默认pipeline/1
并且pipe_through/1
只接收一个作为标识符的原子,因此无法将参数传递给我的插件。
使用此插头的正确方法是什么,以便我可以在router.ex
内使用它?
我最终使用了一些宏魔法:
defmodule PlugUtils do
defmacro __using__(_) do
quote do
import unquote(__MODULE__)
end
end
defmacro param_pipe(pipe_name, plug_name, plug_params) do
quote do
pipeline unquote(pipe_name) do
plug unquote(plug_name), unquote(plug_params)
end
pipe_through unquote(pipe_name)
end
end
end
女巫反过来可以通过以下方式在路由器模块中使用:
use PlugUtils
param_pipe :backups_upload, RolePlug, :upload_backup
这种方法的唯一缺点是我不能指向控制器的原子,因为这个插头是在路由器插头之前执行的,但是通过制作单独的范围可以实现同样的事情。