我們介紹過了注冊,也介紹過登錄,但還有個小問題需要我們注意。
來看下 user_controller.ex
文件中 create
動作的代碼:
def create(conn, %{"user" => user_params}) do
changeset = User.changeset(%User{}, user_params)
case Repo.insert(changeset) do
{:ok, _user} ->
conn
|> put_flash(:info, "User created successfully.")
|> redirect(to: Routes.user_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
代碼里,我們在成功創(chuàng)建用戶后,發(fā)布了一條臨時性的提示消息,然后頁面重定向到所有用戶的列表頁。
我們希望用戶注冊成功后自動登錄,并且跳轉(zhuǎn)到站點的主頁。
我們調(diào)整下 user_controller_test.exs
文件中的測試:
diff --git a/test/controllers/user_controller_test.exs b/test/controllers/user_controller_test.exs
index 95d3108..26055e3 100644
--- a/test/controllers/user_controller_test.exs
+++ b/test/controllers/user_controller_test.exs
@@ -17,8 +17,11 @@ defmodule TvRecipe.UserControllerTest do
test "creates resource and redirects when data is valid", %{conn: conn} do
conn = post conn, Routes.user_path(conn, :create), user: @valid_attrs
- assert redirected_to(conn) == Routes.user_path(conn, :index)
+ assert redirected_to(conn) == Routes.page_path(conn, :index)
assert Repo.get_by(User, @valid_attrs |> Map.delete(:password))
+ # 注冊后自動登錄,檢查首頁是否包含用戶名
+ conn = get conn, Routes.page_path(conn, :index)
+ assert html_response(conn, 200) =~ Map.get(@valid_attrs, :username)
end
然后修改 user_controller.ex
文件:
diff --git a/web/controllers/user_controller.ex b/web/controllers/user_controller.ex
index 7d13c5f..8d8a6f5 100644
--- a/web/controllers/user_controller.ex
+++ b/web/controllers/user_controller.ex
@@ -17,10 +17,11 @@ defmodule TvRecipe.UserController do
changeset = User.changeset(%User{}, user_params)
case Repo.insert(changeset) do
- {:ok, _user} ->
+ {:ok, user} ->
conn
|> put_flash(:info, "User created successfully.")
- |> redirect(to: Routes.user_path(conn, :index))
+ |> put_session(:user_id, user.id)
+ |> redirect(to: Routes.page_path(conn, :index))
{:error, changeset} ->
render(conn, "new.html", changeset: changeset)
end
運行 mix test
,測試全部通過。
更多建議: