【问题标题】:How to PATCH or DELETE from a form without javascript如何在没有 javascript 的情况下从表单中修补或删除
【发布时间】:2016-03-29 09:35:48
【问题描述】:

我正在 Phoenix 上编写一个简单的 crud 应用程序。如何在不使用 javascript 的情况下从表单提交 PATCH 和 DELETE 请求?

【问题讨论】:

  • @Barmar 这是凤凰特有的问题
  • 如果取决于浏览器在<form>中支持什么,我认为框架并不重要。
  • @Barmar - 不是这样,问题实际上是如何告诉 Phoenix 忽略显式动词 (POST) 并改用 PATCH。 Rails 使一个特定的约定变得流行(使用 _method 覆盖动词),因此可以合理地打赌 Phoenix 做了类似的事情,但可能不会。

标签: phoenix-framework


【解决方案1】:

啊,我想通了,和rails一样:

<form method="POST">
  <input name="_method" type="hidden" value="patch" />
...

在 Plug.MethodOverride 中处理:https://github.com/elixir-lang/plug/blob/master/lib/plug/method_override.ex

【讨论】:

  • 查看@Barmar 的评论,并非所有浏览器都受支持——有些只支持 GET 和 POST。例如,Rails 使用隐藏的表单字段 _method 作为解决方法。
  • @PatrickOscity,一点也不粗鲁,但我的问题预设了这样一个事实,即浏览器并非都支持 GET 和 POST 以外的方法,而您评论的答案明确指出不我只是弄明白了,但我使用的是与 rails 中使用的完全相同的解决方法。我觉得您和 Bamar 都没有花时间真正阅读我的问题或答案。 :/ 我在要求一个 Phoenix 特定的解决方案......我找到了。
  • 我链接到的问题中的第一个答案不是这个解决方案吗?
  • @greggreg 对此感到抱歉。确实,我似乎没有正确阅读您的答案。也许早上有点太早了。我刚刚看到输入元素并跳过了该行的其余部分。你的方法非常好!
  • @Barmar 您链接到的问题的第一个答案只是指出许多浏览器仅支持 GET 和 POST,某些框架有解决方法(这是我的实际具体问题)并且 AJAX 请求支持其他 HTTP动词。
【解决方案2】:

&lt;form&gt; 元素仅支持发送GETPOST 请求。 Rails 使用的解决方法是从_method 请求参数中读取请求方法,覆盖实际的请求方法(GETPOST 方法)。

Phoenix 通过Plug 实现了完全相同的功能,Phoenix 是基于 Rack 类框架构建的。长话短说,Plug 提供了中间件,它提供的中间件之一是 Plug.MethodOverride,这正是我们所讨论的。在中间件中这样做,Phoenix 应用几乎不知道原始请求不是GET/POST

你可以看到Plug.MethodOverride使用了in Phoenix's source code

【讨论】:

【解决方案3】:

正如其他人所提到的,Phoenix 通过MethodOverride 插件在路由中处理这个问题。

要使用 form_for 帮助器在模板中更改此设置,请使用 :method 参数:

&lt;%= form_for @changeset, path(@conn, :update), [multipart: true, method: "patch"], fn f -&gt; %&gt;

这会将隐藏的输入添加到 HTML,如 @greggreg 所述:

&lt;input name="_method" type="hidden" value="patch" /&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多