在page_controller.ex
内部,我有一个索引和个人资料操作。
defmodule Kappamon.PageController do
use Kappamon.Web, :controller
plug Kappamon.Plugs.RequireLogin when action in [:profile]
def index(conn, _params) do
render conn, "index.html"
end
def profile(conn, _params) do
render conn, "profile.html"
end
end
这两个操作的唯一区别是RequireLogin
插件通过选中conn.assigns[:current_user]
来检查用户是否已登录。
这是插件:
defmodule Kappamon.Plugs.RequireLogin do
import Plug.Conn
import Phoenix.Controller
alias Kappamon.Router.Helpers
def init(_opts) do
end
def call(conn, _) do
if conn.assigns[:current_user] do
conn
else
conn
|> put_flash(:error, "Sorry, you have to be logged in first.")
|> redirect(to: Helpers.page_path(conn, :index))
|> halt()
end
end
end
当我重定向到put_flash
时,:index
方法正常工作,但是当我重定向到:profile
时,Flash消息为nil
。
以下是发生问题的控制器操作。
def delete(conn, _param) do
user = Ecto.Changeset.change(conn.assigns[:current_user],
spotify_refresh: nil,
spotify_access: nil)
case Repo.update(user) do
{:ok, _} ->
conn
|> put_flash(:info, "Successfully disconnected from Spotify!")
|> redirect(to: page_path(conn, :profile))
{:error, _} ->
conn
|> put_flash(:error, "There was an error disconnecting Spotify. Sorry about that.")
|> redirect(to: page_path(conn, :profile))
end
end
如果我将:profile
更改为:index
,则会显示Flash消息。