【问题标题】:Elixir phoenix Logout link does not workElixir phoenix 注销链接不起作用
【发布时间】:2017-04-16 21:10:52
【问题描述】:

我的应用程序中有以下注销链接,但是当我单击它时,它什么也没做。

<li class="nav-item">
  <%= link "Logout", to: session_path(@conn, :delete), method: :delete, class: "nav-link" %>
</li>

上面代码生成的html元素是

<li class="nav-item">
  <form action="/logout" class="link" method="post">
    <input name="_method" type="hidden" value="delete">
    <input name="_csrf_token" type="hidden" value="GiA4JANYN10+JQhfUgIEARxZCRIEAAAUijC25v5Kj8j7KI6qrOtv==">
    <a data-submit="parent" href="#">Logout</a>
  </form>
</li>

有没有人看到这里有什么明显的错误,即单击注销链接时不会做任何事情?

早午餐配置.js

javascripts: {
 joinTo: {
   "js/app.js": /^(web\/static\/js)/,
   "js/jquery-ujs.js.js": ["web/static/vendor/js/jquery-ujs.js.js"],
   "js/jquery.js": ["web/static/vendor/js/jquery.js"]
 },
 ...

【问题讨论】:

标签: elixir phoenix-framework


【解决方案1】:

我相信负责处理此类情况的代码位于 phoenix_html 包的 js 文件中,因此您需要确保已将此包添加到 mix 并在您的 app.js 文件中有以下行未注释:

import "deps/phoenix_html/web/static/js/phoenix_html"

【讨论】:

  • 它对我不起作用,注销仍然在 href 上有 # 值
【解决方案2】:

在我的情况下,它是由于缺少 npm 依赖项而发生的。

在 phoenix.server 日志中,我注意到 app.js 由于缺少 babel-preset-2015 和 babel-preset-2016 而没有构建。

npm i --save-dev babel-preset-2015 babel-preset-2016

【讨论】:

    【解决方案3】:

    一种可能的解决方法是执行 GET 请求而不是 DELETE 请求:

    您的 html.eex 代码:

    <li class="nav-item">
      <%= link "Logout", to: session_path(@conn, :delete), class: "nav-link" %>
    </li>
    

    一个示例 router.ex:

    resources "/sessions", SessionController, only: [:new, :create]
    get "/sessions", SessionController, :delete
    

    【讨论】:

    • 虽然这可行,但不建议使用这种方法。会话是一个实体,因此可以创建、更新、查看或销毁。对于这些动作,HTML 有不同的动作,浏览器和响应服务器通过这些动作知道(因此可以做一些检查)仅通过检查请求的类型来尝试点击什么。 GET 请求通常不会被检查,而其他请求则必须具有例如正确的 csrf 令牌以避免 XSS 脚本。
    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2013-10-02
    • 1970-01-01
    • 2018-01-26
    • 2017-01-07
    • 2012-06-19
    相关资源
    最近更新 更多