put_flash没有重定向或渲染?

时间:2017-01-08 22:49:17

标签: elixir phoenix-framework

我有一张表格供用户输入信息。如果成功添加成功,我想要弹出一条消息(没有页面重定向,就像AJAX调用一样)。问题是出现了Plug.Conn.NotSentError错误

模板:

<%= form_for @changeset, foo_path(@conn, :create), fn f -> %>
  <div class="form-group">
    <%= text_input f, :email, placeholder: "Email", class: "form-control" %>
  </div>
  <%= submit "Subscribe!", class: "btn btn-primary" %>
  <p><%= get_flash(@conn, :info) %></p>
<% end %>

控制器:

def create(conn, %{"user" => user_params}) do
  changeset = User.changeset(%User{}, user_params)
  case Repo.insert(changeset) do
    {:ok, user} ->
      conn
      |> put_flash(:info, "Thank you!")
    {:error, user} ->
      conn
      |> put_flash(:info, "An error occurred.")
  end
end

1 个答案:

答案 0 :(得分:0)

put_flash/3会向连接添加一条Flash消息。该连接用于回复。在你的情况下,没有答复。您需要某种回复才能将数据(包括Flash消息)传回客户端。

如果您只想将Flash消息附加到当前站点,人们通常会再次呈现相同的内容(通常页面包含表单)。 render conn, :new

另一种可能性是使用ajax或频道来获得更流畅的体验。在ajax的情况下,您可以使用javascript来显示消息。在phoenix中,您可以渲染任何字符串以在控制器中给出适当的响应。所以你要说text conn, "your text, which can be json or not"。请参阅文档here。 然后,您可以使用jquery显示您的Flash消息并发出请求。检查their doc以了解如何执行此操作。你可能想要使用.done回调。

第三个选项(频道)不是什么东西,我推荐这个任务,除非你有很多这样的形式。