6 - 管理者

現在要區分 admin, user的功能,
之後登入了 admin後,navbar下拉選單會多出新增商品
先在 user model加入 admin欄位
mix ecto.gen.migration add_admin_to_users

修改 migration 檔案

#web/priv/repo/migration/XXXXXX_add_admin_to_users.ex
  def change do
    alter table(:users) do
      add :admin, :boolean, default: false
    end
  end

要注意的是記得 model也要自己加入 :admin 欄位
這是 phoenix的特點,讓開發者知道到底什麼被新增了
接著 mix ecto.gen.migrate 變化資料庫
完成後可以用
iex> ShoppingSite.Repo.all(ShoppingSite.User) 檢查看看是不是真的多了 admin 這個值


但我們沒有要讓每個人都可以成為使用者,我們用 iex來改變這個值 先找到想要改的 user 的 id

iex> user = ShoppingSite.Repo.get!(ShoppingSite.User, id)
iex> user |> Ecto.Changeset.change(%{admin: true}) |> Repo.update

同場加映: 如何用 query取出某個 user

iex> import Ecto.Query
iex> query = from u in User, where: u.username == "MyName"
iex> user = ShoppingSite.Repo.one(query)

管理者可以修改商品

在 admin/product_controller.ex新增 edit

#web/controllers/admin/product_controller.ex
  def edit(conn, %{"id" => id}) do
    product = Repo.get!(Product, id)
    changeset = Product.changset(product)
    render conn, "edit.html", product: product, changeset: changeset
  end

  def update(conn, %{"id" => id, "product" => product_params}) do
    product = Repo.get!(Product, id)
    changeset = Product.changeset(product, product_params)

    case Repo.update(changeset) do
      {:ok, _product} ->
        conn
        |> put_flash(:info, "Update product successfully.")
        |> redirect(to: admin_product_path(conn, :index))
      {:error, changeset} ->
        render(conn, "edit.html", product: product, changeset: changeset)
    end
  end
#web/templates/admin/product/edit.html.eex
<h1>Edit new product</h1>

<%= render "form.html", changeset: @changeset,
    action: admin_product_path(@conn, :update, @product) %>

<%= link "Back", to: page_path(@conn, :index) %>

results matching ""

    No results matching ""