【问题标题】:Devise logout not working设计注销不起作用
【发布时间】:2016-01-13 05:27:57
【问题描述】:

我正在使用最新版本的 devise 和 rails 4.2.4。 我有我的主页

 public/index.html

其中包含大量的javascript。但是当我从其他页面加载它时,它并没有加载所有的效果。所以包括

 $(document).on('page:load', ready);
 <script src="/js/modernizr-2.6.2.min.js"></script>
 <script src="/js/main.js"></script>

在 application.js 文件中。 但是之后 退出

<%= link_to "Logout",destroy_user_session_path, method: :delete %>

不起作用!它被呈现为 GET /users/sign_out。

当我从 application.js 中删除这些链接时,它工作正常。

此问题的任何解决方法?

【问题讨论】:

  • 问题:如果您使用的是 Rails,为什么您的主页是公开的,而不是某种 Rails 模板?
  • @TarynEast 好吧,我尝试将其包含在应用程序中,但缺少一些效果。
  • 是的,但你不应该以这种方式包含它 - 如果你正在做一个标准的 Rails 应用程序应该是一个 erb 模板。
  • 好的,刚刚意识到由于降价格式,您的一半代码是不可见的。 ;) 注意:使用 > 表示引号。代码使用四个缩进空格。
  • 但是如果我以 erb 模板的形式包含,一些脚本没有加载。这和我的问题有关吗?

标签: javascript ruby-on-rails devise


【解决方案1】:

您的 javascript 中有错误。

--

每次使用 method: :deletemethod: :patch 时,Rails 都会使用适当的动词 using Javascript 填充表单以正确设置:

[link_to] 动态创建 HTML 表单并立即提交表单以使用指定的 HTTP 动词进行处理。对于让链接在删除记录等危险操作中执行 POST 操作(搜索机器人可以在爬取您的站点时跟踪)时很有用。支持的动词有:post、:delete、:patch 和:put。 请注意,如果用户禁用了 JavaScript,请求将回退到使用 GET

如果您的 javascript 已损坏(即您有错误阻止它在页面上正常工作),上述情况属实。

--

由于你还没有发布你的 JS,我不能给你任何细节。

但是,我可以说你的 JS 应该尽可能的unobtrusive

在 Rails 应用程序的任何地方使用 &lt;script&gt; 是不好的做法;您应该在sprockets manifest directives 的帮助下将文件连接到您的application.js

#app/assets/javascripts/application.js
//= require main
//= require modernizr

【讨论】:

    【解决方案2】:

    问题是大多数浏览器不支持 DELETE 方法,请求实际上将作为 GET 提交,带有data-method="delete" 属性。这依赖于您的页面正在加载的“用于 jQuery 的非侵入式脚本适配器”(jquery-ujs)。

    如果您使用的是标准的 Rails 模板,“application.js”清单文件会为您处理这些问题,但鉴于您将 index.html 放在公共目录中,您必须手动包含 @ 987654323@ 和 jquery-ujs 在您的标题中。

    另一种方法是将注销的路径更改为实际使用 GET(无论如何,您也会遇到 PUT 和 PATCH 方法的问题),将其添加到您的设计配置中(来自devise wiki):

    # config/initializers/devise.rb
    # The default HTTP method used to sign out a resource. Default is :delete.
    config.sign_out_via = :get
    

    如果您打算使用 rails,您应该找出您在使用标准 rails 处理视图模板的方式时遇到问题的原因。我使用了很多 javascript-heavy 页面,它们工作得很好。此外,您还可以获得资产管道的所有好处。

    【讨论】:

    • 我知道挂在 devise.rb 中,但我不想和 GET 方法相处。谢谢!
    • 我认为如果您使用GET 注销,那么浏览器预取和在&lt;img&gt; 标签中嵌入注销URL 的用户可能会意外注销用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2018-10-28
    • 2017-01-07
    • 2012-06-19
    相关资源
    最近更新 更多