【问题标题】:Elixir/Phoenix redirect to the current pageElixir/Phoenix 重定向到当前页面
【发布时间】:2016-06-07 00:48:08
【问题描述】:

我正在尝试在应用中实现不同的语言。所以我所做的是在 db 中的 Session 中创建了 lang 变量,它保留了当前选择的语言。

问题是我正在通过更新操作调用和更新值:

def update(conn, %{"id" => id, "session" => session_params}) do
session = Repo.get!(Session, id)
changeset = Session.changeset(session, session_params)

case Repo.update(changeset) do
  {:ok, _session} ->
    conn
    |> put_flash(:info, "Session updated successfully.")
    |> redirect(to: page_path(conn, :tableshow))
  {:error, changeset} ->
    render(conn, "edit.html", session: session, changeset: changeset)
end
end

,将其重定向到特定路径(此处为:page_path)。我的问题:一旦调用动作,是否可以获得当前路径并重定向到它?那么,当您更改语言时,它不仅会一直将您重定向到一个特定页面,而是会重新加载当前页面,即调用该操作的位置? 语言选择器位于每个页面的标题中。所以我希望页面只是重新加载。有什么建议吗?

附加信息:我正在像这样从 app.html.eex 调用操作

<%= render Pos1.SessionView, "session_en.html", changeset: @changesetlang, action: session_path(@conn, :update, @session) %>

其中 session_en.html 是:

<%= form_for @changeset, @action, fn f -> %>
<%= hidden_input f, :lang, value: "1" %>
<%= submit "EN", class: "btn btn-primary" %>
<% end %>

【问题讨论】:

  • 能否请您发布您用于将链接/表单从您应用中的所有页面添加到此操作的代码?
  • 嘿@Dogbert 这是表单/链接代码。

标签: phoenix-framework elixir


【解决方案1】:

一种方法是使用当前页面的 URL 添加另一个 hidden_input,然后从 update 操作重定向到该 URL。

app.html.eex 中,将render 调用更改为将@conn 传递为conn

<%= render Pos1.SessionView, "session_en.html", changeset: @changesetlang, action: session_path(@conn, :update, @session), conn: @conn %>

然后将新的hidden_input 添加到session_en.html.eex

<%= form_for @changeset, @action, fn f -> %>
  <%= hidden_input f, :lang, value: "1" %>
  <%= hidden_input f, :redirect_to, value: @conn.request_path %>
  <%= submit "EN", class: "btn btn-primary" %>
<% end %>

最后,在控制器中,将 redirect 调用更改为:

|> redirect(to: session_params["redirect_to"])

编辑:您可能希望将redirect_to 限制为仅指向您的站点。你可以用一个简单的case

redirect_to = case session_params["redirect_to"] do
  path = "/" <> _ -> path
  _ -> "/some/default/path"
end

然后

|> redirect(to: redirect_to)

感谢 Scott S. 指出这一点。

【讨论】:

  • 小心重定向到用户提供的位置。这种功能有时会被欺诈者和网络钓鱼者滥用,以使链接看起来合法。我建议实施一些措施以确保提交的 redirect_to 值在您的域上,或者根本没有域的路径。
  • @ScottS。你是对的,谢谢,我已经根据你的建议编辑了答案。
  • 嘿@ScottS。感谢您提及这一点,绝对值得考虑!
  • @ScottS。不重定向/ 1 处理吗?当我尝试使用检查器将redirect_to 字段更改为“google.com”时,我得到了the :to option in redirect expects a path but was "google.com"。从这条消息中,我假设 redirect/1 确保没有传入任何外部链接。
  • @Fomentia 现在可以了,除非使用 external 关键字,但我不相信在发布问题时会这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-10
  • 2022-01-22
相关资源
最近更新 更多