Elixir / Phoenix重定向到当前页面

时间:2016-06-04 07:40:44

标签: elixir phoenix-framework elixir-framework

我正在尝试在应用中实现不同的语言。所以我所做的就是在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 %>

1 个答案:

答案 0 :(得分:7)

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

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.指出这一点。