我正在使用凤凰城的ex_admin套餐。在成功完成标准安装后,我创建了一个User
资源,其中包含名称和头像(将在S3上引用文件)
>> mix phoenix.gen.model User users name:string avatar:string
>> mix admin.gen.resource User
modules: [
MyApp.ExAdmin.Dashboard,
MyApp.ExAdmin.User
]
>> iex -S mix phoenix.server
效果很好。现在,我想添加修改create
函数的等价物,如果我使用web/controllers/user_controller.ex
制作了资源,mix phoenix.gen.html User ...
中将存在该函数。但是,尽管后端是正确的CRUD,我找不到这个特定资源的任何控制器。
解决这个问题的最佳方法是什么?创建一个web/controllers/user_controller.ex
文件并覆盖它?将该函数作为模块添加到其他地方?
答案 0 :(得分:1)
有两种方法可以在ExAdmin中挂钩控制器操作。
<强> 1。在控制器上添加addIngredient (itemId: string, name: string, quantity: number, unit: string): void {
const ingControl = <FormArray>this.item.controls['ingredients'];
ingControl.push(this.fb.group({
itemId: [itemId || '', Validators.required],
name: [name || '', Validators.required],
quantity: [quantity || 0, Validators.required],
unit: [unit || 'Grams', Validators.required] <-----------
}));
}
或before_filter
。
对于此方法,请在资源文件中使用after_filter
宏。
controller
查看大师here
中的文档<强> 2。创建自己的控制器
使用此方法,您可以使用要覆盖的操作创建控制器。要使用自定义控制器,您需要为所需操作添加路由。只需确保您创建的路由位于路由器中的此块之上。
defmodule MyApp.ExAdmin.License do
use ExAdmin.Register
register_resource MyApp.License do
# ...
controller do
before_filter :set_current_user, only: [:create, :update]
before_filter :set_updated_by, only: [:update]
def set_current_user(conn, params) do
new_params = put_in(params, [:license, :user_id], MyApp.Authentication.current_user(conn).id)
{conn, new_params}
end
def set_updated_by({conn, params}, _params) do
new_params = put_in(params, [:license, :updated_by_id], MyApp.Authentication.current_user(conn).id)
{conn, new_params}
end
end
end
end
以下是自定义控制器的示例。请注意,您需要包含scope "/admin", ExAdmin do
pipe_through :browser
admin_routes
end
。
@resource "my_resource"
这是路线:
defmodule ExAdmin.ClientController do
@resource "clients"
use ExAdmin.Web, :resource_controller
alias UcxRemote.{Client, Repo, ClientService}
require Logger
use Utils
def create(conn, _defn, %{_format: "json", client: client_params} = _params) do
result = do_create conn, client_params
case result do
{:ok, client} ->
put_view(conn, UcxRemote.ApiClientView)
|> render("create.json", client: client)
{:error, _changeset} ->
json conn, %{errors: ["Validation failed"]}
end
end
def create(conn, defn, params) do
result = do_create conn, params[:client]
case result do
{:ok, client} ->
conn
|> put_flash(:notice, "Client was successfully created.")
|> redirect(to: admin_resource_path(client, :show))
{:error, changeset} ->
errors = get_errors(changeset, "creating")
conn
|> put_flash(:error, errors)
|> handle_changeset_error(defn, changeset, params)
end
end
defp do_create(conn, %{user_id: user_id} = client_params) do
changeset = %Client{user_id: user_id}
|> Repo.preload([user: :company])
|> Client.changeset(client_params)
Repo.insert(changeset)
end
end