【问题标题】:Phoenix framework: Submission of custom information via JSON or hidden form?Phoenix 框架:通过 JSON 或隐藏表单提交自定义信息?
【发布时间】:2018-08-14 11:47:16
【问题描述】:

我需要提交一些信息,这些信息将在某些客户端操作完成后通过 Javascript 函数自动计算(例如,考虑一个打地鼠游戏,其中需要在时间到时传输和记录分数)。

我有一个合适的模型来记录信息。如果我尝试将信息作为 JSON 发送,则来自控制器的 create 操作运行良好。但是,我似乎无法轻松地重定向用户并在之后显示自定义 Flash 消息。 (我习惯了put_flash 方法,在这种情况下似乎不起作用)。

我是否应该尝试在页面上构建一个隐藏的表单,并尝试填充隐藏的输入字段+在操作完成后通过 JS 触发“提交”按钮?如果不是,如果我通过 JSON POST 请求与控制器交互,执行重定向 + 显示闪存消息的正确方法是什么?我想我还没有完全理解 Flash 消息的机制。


编辑:默认情况下,控制器代码就像:

case Repo.insert(changeset) do
  {:ok, record} ->
    conn
    |> put_flash(:info, "Record saved successfully.")
    |> redirect(to: record_path(conn, :index))
    ...

end

这显然不适用于 JSON 请求。

现在我正在做:

   {:ok, lesson_record} ->
    conn
    |> send_resp(200, "success")
    ...

并让 Javascript 解析响应代码并进行重定向。但是我不知道在这种情况下如何显示 Flash 消息。

【问题讨论】:

  • 您可以显示控制器代码和任何其他适用代码吗?
  • @Bitwise 我认为问题在于我不确定如何编写正确的控制器响应。如果我写put_flash,然后是redirect,就像在正常的表单提交中一样,包含新页面的文本内容将返回给POST请求,这显然不起作用。我应该使用put_resp_content_type("application/json"),返回带有redirect 字段的JSON,然后在Javascript 中手动运行window.location.replace(data.redirect)?在那种情况下,我仍然不确定如何显示闪光灯。

标签: javascript ajax post elixir phoenix-framework


【解决方案1】:

如果你想显示 flash 消息并将用户重定向到 http 无论如何,你为什么要从 JSON POST 开始呢?这看起来像一个普通的 HTTP POST。

虽然不需要构造隐藏表单,只需将内容类型设置为application/x-www-form-urlencoded 并构造请求,如下所示:

  const data = [
    encodeURIComponent(key1) + "=" + encodeURIComponent(value1),
    encodeURIComponent(key2) + "=" + encodeURIComponent(value2)
  ].join("&");
  const request = {
    method: 'POST',
    url: url,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    data: data
  };
  post_it(request);

使用这种类型的请求,您的所有重定向、flash 消息等都将完美运行,因为它是一个普通的 HTTP POST,通过相应的默认管道

【讨论】:

  • 谢谢。我最终决定使用 JSON 模式弹出窗口,但如果我想坚持使用重定向 + Flash,这应该正是需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 2019-03-03
  • 1970-01-01
相关资源
最近更新 更多