【问题标题】:Rails 3 UJS - controller gets called twice by link_to :remoteRails 3 UJS - 控制器被link_to调用两次:remote
【发布时间】:2010-11-20 08:40:17
【问题描述】:

我有一个奇怪的问题,JQuery 正在为 link_to 方法创建两个 AJAX 请求。我正在为 UJS 开发一个带有 JQuery 的 Rails 3 应用程序。我有一个切换链接,可以在“关注”和“取消关注”之间切换

我的链接如下:

<span id="follow_link">
  <a href="/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Unfollow</a>
</span>

我的控制器是这样设置的:

def tfollow_artist
  @artist = Artist.find(params[:id])
  if current_user.following?(@artist) 
    current_user.stop_following(@artist)
  else 
    current_user.follow(@artist)
  end
 end

最终将 js 渲染为:

 $('#follow_link').html('<%= escape_javascript(render :partial => "follow") %>');

这基本上用相同的 URL 替换了 '... 的 html 内容,只是文本不同。例如,上面现在将呈现为:

<span id="follow_link">
  <a href="/tfollow_artist?id=8103103" data-method="post" data-remote="true" id="follow_artist" rel="nofollow">Follow</a>
</span>

但是,这会导致 JQuery 发出两个 AJAX 请求。

谁能看出这里出了什么问题?

我正在使用“jquery-rails”gem,它将最新的 jquery-ujs 文件复制到我的应用程序中。 jQuery版本是1.4.3

【问题讨论】:

  • 即使我面临这个错误.. 任何解决方案?
  • 这里有同样的问题。仍在寻找解决方案。
  • 同上这个问题..你有没有想过这个问题?
  • 也面临同样的问题... jquery-rails 1.0.16版。

标签: jquery ruby-on-rails-3 ujs


【解决方案1】:

感谢这个对话框:

https://github.com/rails/jquery-ujs/issues/208

我发现 jquery 和 jquery_ujs 被包含了两次。

我猜 jquery-rails gem 会自动将它们放入 application.js,然后我将它们也包含在 application.js 中。

似乎无论出于何种原因,application.js 都会自动将所有内容捆绑在 app/assets/javascripts/ 中——即使我删除了 all 的要求。

所以,如果您的 :remote => true 表单被提交了两次,请尝试检查 application.js。

希望这会有所帮助!

更新:我相信这可能与我在不使用摘要的情况下预渲染资产有关,因此当我的开发环境根据 app/assets/application. js,它还为应该是空的动态 application.js 添加了一个,除了来自 public/assets 的静态应用程序被加载。令人困惑?是的!

【讨论】:

    【解决方案2】:

    我有同样的问题,通过评论这一行来解决

    \#config.assets.debug = true
    

    处于开发模式

    【讨论】:

    • 这对我有用,并且消除了重复的 ajax 调用,但由于某种原因,我不需要在我的其他工作站上执行此操作。这个设置有什么作用,为什么我们需要打开/关闭它,什么时候使用它?
    • 这仍然有效。有谁知道他/她的头为什么
    【解决方案3】:

    我有类似的问题。运行以下 rake 任务解决了我的问题。

    rake tmp:clear
    rake assets:clean
    

    【讨论】:

      【解决方案4】:

      我认为正在发生的事情是您的 JavaScript 没有阻止浏览器执行链接。所以你得到 AJAX 请求然后是浏览器请求。

      Rails Cast 174 中有对此的解释和解决方案。文字解释here,大约下页的3/4。

      【讨论】:

      • 感谢您的链接和解释。这是有道理的。但是,在调用 link_to :remote 时进行远程调用的 Javascript 已经使用“live”方法和“prevents”默认值(这是在 jquery-ujs 的 rails.js (github.com/rails/jquery-ujs/raw/master/src/rails.js): $('a[data- remote],input[data-remote]').live('click.rails', function (e) { $(this).callRemote(); e.preventDefault(); }); 所以不确定有没有什么其他的就是这里。
      • 不是依赖于返回值吗?
      【解决方案5】:

      我遇到了同样的问题:使用 :remote => true 时出现重复请求。我的问题是由于使用 Heroku 和预编译资产。我在部署到 Heroku 之前预编译资产(rake assets:precompile)。这实质上会在您的公用文件夹中创建资产管道的副本。因此,Docunext 提到的同样的事情发生了:有多个 javascript 文件处理每个请求。

      如果我在本地工作时删除公共目录中的资产(git rm -rf public/assets),它会得到修复。从公共目录中删除资产后,它停止发送多个请求

      【讨论】:

        【解决方案6】:

        试试这个代码..防止双击远程链接..

        $('a[data-remote=true]').live('ajax:before', function () {
           if ($(this).attr('ajax-loading')) {
             return false;
           } else {
             $(this).attr('ajax-loading', true);
           }
        }).live('ajax:complete', function () {
          $(this).removeAttr('ajax-loading');
        });
        

        Gist

        【讨论】:

          【解决方案7】:

          对我来说也是同样的问题:两次 XMLHttpRequest on a link_to ... :remote => "true"

          我已经解决了,在

          locals/application.rb

          通过评论

          // config.assets.paths

          并取消注释

          config.action_view.javascript_expansions[:defaults] = %w(jquery jquery-ui 应用程序)

          然后我在最后一次 git pull 之后忘记了做。 我希望能帮助别人。

          【讨论】:

            【解决方案8】:

            您想要的 JavaScript 文件为 :defaults(始终包含 application.js)。

             config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
            

            注释行明确表示始终包含 application.js。 在我的应用程序中,我在默认值中添加了应用程序。所以对于 ajax .submit 它在我的应用程序中创建了两条记录。

            【讨论】:

              【解决方案9】:

              我刚才遇到了同样的问题。检查所有代码更改并尝试其他方法但无济于事。终于清除了浏览器缓存。这有帮助。

              【讨论】:

                【解决方案10】:

                如果你找不到两次加载ujs文件的位置,只需将此代码复制到rails.js/application.js中(最好不要在这里)

                var alreadyInitialized = function() {
                    var events = $(document).data('events');
                    return events.click && $.grep(events.click, function(e) { return e.namespace === 'rails'; }).length;
                    }
                
                if ( alreadyInitialized() ) {
                    $.error('jquery-ujs has already been loaded!');
                }
                

                【讨论】:

                  【解决方案11】:

                  基于 Eugene 的回答,请注意,如果您在本地预编译资产以进行生产之后进行开发,例如...

                  bundle exec rake assets:precompile RAILS_ENV=production
                  

                  ...那么当您继续开发时,Rails AssetPipeline 将希望为 您未编译的 您已编译的资产提供服务。

                  修复它的一种方法是使用 Eugene 的 Rails 的标准 rake 任务。另一种方法是简单地删除那些讨厌的预编译生产就绪资产,例如

                  $ rm -rf #{Rails.root}/public/assets
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-07-03
                    • 2013-10-22
                    • 2011-03-31
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多