Phoenix 注冊成功自動登錄

2023-12-18 14:40 更新

我們介紹過了注冊,也介紹過登錄,但還有個小問題需要我們注意。

來看下 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,測試全部通過。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號