我正在尝试在应用中实现不同的语言。所以我所做的就是在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 %>
答案 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.指出这一点。