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) %>