在ex_admin中添加控制器方法(Phoenix)

时间:2017-05-03 01:23:18

标签: elixir admin backend phoenix-framework

我正在使用凤凰城的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文件并覆盖它?将该函数作为模块添加到其他地方?

1 个答案:

答案 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
相关问题