注册成功自动登录

我们介绍过了注册,也介绍过登录,但还有个小问题需要我们注意。

来看下 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

代码里,我们在成功创建用户后,发布了一条临时性的提示消息,然后页面重定向到所有用户的列表页。

我们希望用户注册成功后自动登录,并且跳转到站点的主页。

我们调整下 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,测试全部通过。

下一章,我们开发退出登录功能。

上一章:登陆 下一章:退出登录

最后更新于