【问题标题】:link_to :confirm displays popup twicelink_to :confirm 显示两次弹出窗口
【发布时间】:2010-12-17 22:52:52
【问题描述】:

这个标签带有rails 3

<%= link_to 'Destroy', item, :method => :delete,:confirm=>'Are you sure?' %>

生成这个 html

<a href="/news/3" data-confirm="Are you sure?" data-method="delete" rel="nofollow">Destroy</a>

条目被删除,问题是弹窗出现了两次。

这可能是什么原因造成的?

【问题讨论】:

  • 你使用的是什么 JavaScript 库?

标签: ruby-on-rails


【解决方案1】:

我遇到了同样的问题,花了一个小时的大部分时间来研究它。我在我的情况下找到了一个解决方案,我想我会分享它以防万一它有帮助......

我的问题是我有

config.assets.debug = true 

config/environments/development.rb

将该行改为

config.assets.debug = false

为我修复了确认重复。我在this rails guide to asset pipeline找到了相关信息。希望对您有所帮助!

【讨论】:

  • 这里也一样。我发现如果我从开发服务器中删除已编译的资产,我可以继续调试。
  • 谢谢——不知道为什么会发生这种情况。
  • 只是想补充一点,就像任何其他环境配置一样,这也需要我重新启动我的 Rails 服务器。 (以防万一有人被绊倒)。
  • 你的答案!不知道为什么我直到现在才遇到这个,但它让我发疯了!谢谢!
  • 我认为@tybro0103 对答案的评论有更好的解决方案。有很多方法可以解决 Rails 中的每个问题,而且很多时候将某些配置设置为 false 太容易了,但这不是正确的方法。发生此错误是有原因的,并且关闭只是摆脱问题的东西并不总是一个好的解决方案。如果您真的需要将config.assets.debug 设置为true,该怎么办?我确实认为这是 Rails 中的一个错误,所以也许没有正确的解决方案,但删除将重新生成的代码似乎比关闭可能会在以后引起问题的东西更好。
【解决方案2】:

听起来 rails.js 中的确认处理程序 Javascript 被附加了两次。

您是否会通过复制 javascript_include_tag 帮助程序意外包含两个 rails.js 副本?

【讨论】:

  • 天啊!就是这样。谢谢。
  • 为什么我没有 rails.js 文件?
  • @Tony 如果您使用的是 Rails 3.1 或更高版本,则在 Asset Pipeline 中将 rails.js 替换为 jquery.js 和 jquery_ujs
  • 对于 Rails 4 上的我来说,Turbolinks 多次重新绑定 jQuery 事件处理程序。使用 jquery.turbolinks 解决了这个问题:github.com/kossnocorp/jquery.turbolinks/blob/master/README.md
  • 在 Rails 5 上,rails-ujs 完成了这项工作,因此将它与 jquery_ujs 一起使用会导致同样的问题。保留其中一个。
【解决方案3】:

我习惯于在我的 haml-layout-file 底部包含 javascript_include_tag

使用 Rails4 和 Turbolinks 会发生:

  • 第一次加载页面时一切正常(确认弹出窗口只出现一次)
  • 访问另一个页面 -> 出现两次弹出窗口
  • 再访问一页 -> 弹出 3 次
  • 等等
  • 直到我重新加载页面。

我通过将javascript_include_tag从底部移动到&lt;head&gt;解决了这个问题

【讨论】:

  • 就是这样! Turbolinks 不会重新加载整个页面,它只会重新加载正文、标题(和其他一些内容),但由于我的 javascripts 在正文中 - 这些内容被多次重新应用!谢谢你,诺肯费尔!
  • 这不仅对我有用,它还修复了我的 Twitter Bootstrap 下拉菜单——它们是在页面重新加载后出现的,而不是在点击另一个页面的链接后出现的。
  • 这也解决了我的问题。谢谢!
  • 这也解决了我的问题!谢谢
  • @AlexKovshovik 但是把 Javascript 放在 head 部分好吗?
【解决方案4】:

我正在使用 Rails 4,但没有一个答案对我有用,但是以下方法有效……我换了行:

<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> 

<%= javascript_include_tag 'application', 'data-turbolinks-eval' => false %>.

https://github.com/rails/turbolinks/issues/244

【讨论】:

    【解决方案5】:

    我从另一篇文章中复制了这个解决方案,但这对我有用(rails 5)

    “从你的 application.js 中删除 jquery_ujs,因为 rails_ujs 对以后的 rails 版本就足够了。”

    我包括: //= require jquery //= require jquery-ujs //= require rails-ujs

    删除后一切正常。 解决方案来自:Why am I getting a JQuery alert twice in Rails?

    【讨论】:

      【解决方案6】:

      这里有很好的答案,

      但是,如果你做了所有的事情,仍然得到那些双弹出窗口,并且如果你在 开发模式 下运行,请检查你是否有 public/assets 加载了已编译的资产。

      删除public/assets/* 即可解决问题。

      【讨论】:

        【解决方案7】:

        这似乎是 Rails 中的一个错误。显然 application.js 中的指令不仅在启用调试模式时扩展为单个文件,而且还包含在 application.js 中。我没有查看 Rails 代码,但假设这是由于 application.js 是默认的 JavaScript 文件。如果您将此文件重命名为其他名称,假设 default.js 它将在调试模式下正确包含指令指定的文件,并且 default.js 将仅输出仅在该文件中的 JavaScript。因此不会产生重复的代码。

        例子:

        应用程序.js

        //= 需要 jquery_ujs

        foo();

        结果:

        1) jquery_ujs.js

        2) 带有 jquery_ujs 内容和 foo() 的 application.js


        default.js

        //= 需要 jquery_ujs

        foo();

        结果:

        1) jquery_ujs.js

        2) 带有 foo() 的 default.js

        【讨论】:

          【解决方案8】:

          我在使用 Rails 3.2.12 时遇到了同样的问题,但只需更新到 3.2.13 就解决了这个问题。

          【讨论】:

            【解决方案9】:

            在我的例子中,jQuery 被加载了两次,因为这条线 //= require_tree .

            为了防止在 application.js 和 application.css 中出现此错误,我习惯于创建一个子目录 app/assets/javascript/autorequire,而不是 require_tree .,我使用 require_tree ./autorequire

            因此,app/assets/javascriptapp/assets/stylesheets 中的文件不再自动/意外地包含在内。我将所有单独的 .css 和 .js 文件放入子目录中,它们被隐式包含。但我可以定义要包含顶级路径中的哪些文件以及包含的顺序。

            自从我这样做以来,我从来没有遇到过资产未按预期加载的问题。

            【讨论】:

              【解决方案10】:

              所以对我来说,这是因为我定义了数据远程而不是远程。

              IE

              数据:{远程:真,...}

              而不是

              远程:真,数据:{ ... }

              希望有帮助。

              【讨论】:

                【解决方案11】:

                就我而言(Rails 3.2.13),我不得不删除 rails.js 来解决同样的问题。

                我没有明确引用 rails.js,更改 config.assets.debug 也没有帮助。

                【讨论】:

                  【解决方案12】:

                  在我的例子中,应用程序同时包含“mootools ujs”和“jquery ujs”。我摆脱了 mootools 之一,现在我只看到一个确认。

                  【讨论】:

                    【解决方案13】:

                    在这样的布局haml中有两次弹出问题

                    %head
                      = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
                      = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
                    %body
                      #calendar.calendarsize
                    

                    然后我推荐它并且它有效。

                    %head
                      = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
                      -#= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
                    %body
                      #calendar.calendarsize
                    

                    【讨论】:

                      【解决方案14】:

                      只需删除在 rails4 中对我有用的 turbolinks

                      【讨论】:

                      • 您可以使用 Turbolinks 解决此问题,您不必将其删除。对于使用 Rails 4 的我来说,Turbolinks 多次重新绑定 jQuery 事件处理程序。使用 jquery.turbolinks 解决了这个问题:github.com/kossnocorp/jquery.turbolinks/blob/master/README.md
                      • 使用该逻辑,您可能会争辩说删除 jQuery 也可以解决问题。 Turbolinks 不是问题,而是缺乏关于如何正确使用 turbolinks 的知识。
                      【解决方案15】:

                      尝试运行任一

                      rake assets:precompile ENV=development 
                      

                      rake assets:precompile ENV=production
                      

                      【讨论】:

                        【解决方案16】:

                        删除:

                        //= require jquery
                        //= require jquery_ujs
                        //= require_tree .
                        

                        来自app/assets/javascripts/application.js。尽管已被评论,但它会加载这些 js 文件。它对我有用。

                        【讨论】:

                        • 这些行没有按照您的建议“注释”。以//= 开头的行实际上是directives used to tell Sprockets the files that you wish to require。此外,您可能想删除 //= require_tree . 行,因为它告诉 Sprockets 递归地包含指定目录中的所有 JavaScript 文件(在本例中为 @987654326 @,当前目录)。最后,我认为这可能对您有用的原因是因为删除了前两行并拥有 jquery-rails gem。
                        • 正如 user664833 所说,这不是文件内的注释。该文件是一个清单文件,它告诉资产管道要加载哪些文件。如果您阅读默认生成文件中的 cmets,它会告诉您它是如何使用的。如果您不想使用 sprockets/assets 管道,请继续删除它们。不过,我个人建议使用它们,因为我发现它可以让我的编码更有效率。
                        • 您不能只删除 Sprockets 声明。这些不是注释行......它们是根据资产管道加载正确资产的说明。
                        猜你喜欢
                        • 2017-08-13
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2022-12-14
                        • 2017-10-15
                        • 1970-01-01
                        • 1970-01-01
                        相关资源
                        最近更新 更多