【问题标题】:Rails ajax background requestsRails ajax 后台请求
【发布时间】:2010-01-15 02:15:59
【问题描述】:

我有一个可以 100% 工作的 remote_form

当用户点击提交时,它会从数据库中抓取数据或从另一个网站抓取数据,并无缝更新页面...

我现在遇到的问题是,我想做同样的事情,但不要让用户点击带有 onload 事件的提交按钮。我想我的做法是错误的:

从技术上讲,这是可行的……它确实获得了正确的数据,但它并没有完全按照 remote_form_tag 所做的那样返回原始数据。没有 RJS replace_html。

有没有办法完全跳过 form_for 并在页面加载时直接执行控制器操作?

<script type="text/javascript">
    $(window).load(function() {
        // executes when HTML-Document is loaded and DOM is ready
        // jQuery.facebox('Big loading! <img alt=\"Loading\" src=\"/images/loaders/loading.gif\" />');
        //$("#update_form").submit();
        $("#update_form").submit(function () { return false; });

    });
</script>

表格

#html.erb
<%  form_remote_tag :url => { :action => "update_availables", :id => params[:id] },
    :loading => "jQuery.facebox('Big loading! <img alt=\"Loading\" src=\"/images/loaders/loading.gif\" />');",
    :html => { :method => "get" },
    :method => "get",
    :html => { :id => 'update_form' } do %>

控制器

  def update_availables
    @do_it = Available.get_new_availables :id => params[:id], :date => user_cart.getDate.to_s
    get_availables

    respond_to do |format|
      format.html
      format.js
    end
  end

RJS

page.replace_html :rooms, :partial => "available"
page << "jQuery.facebox.close();"

【问题讨论】:

    标签: jquery ruby-on-rails ruby rjs jrails


    【解决方案1】:

    好吧,要获得与用户单击表单相同的功能,您可以使用 javascript click 方法:

    $(window).load(function() {
    
        $("#update_form input[type='submit']").click();
    
    });
    

    但是,如果您在没有用户输入的情况下提交,为什么不将数据放在表单中,为什么不在调用操作并直接更新代码的负载处理程序中放置一个 ajax 调用?

    $(window).load(function() {
    
        $.ajax({
          type: "GET",
          url: "scraper_url",
          data: {field1:val,field2:val},
          success: function(responseText){
            // update page
          }
        });
    
    });
    

    【讨论】:

      【解决方案2】:

      我同意弗洛伊德的观点。我通常处理这类事情的方式是从 Rails 操作返回必要的 JSON 数据,而不是使用 RJS 来更新页面。这样做的好处是 JSON 通常可以非常快速地生成,并且可以很容易地作为 to_json 方法移动到模型中,并在许多不同的上下文中重用。

      如果更新页面很简单,你没有理由不能像这样内联,但如果它更复杂,你可以将它定义为静态 javascript 文件中的函数。这种方法的好处是它使您的 javascript 和 ruby​​ 代码更加模块化和解耦。调试和单元测试更容易,因为 javascript 代码独立存在,而不是被有限的 RJS 方法泄漏“抽象”(更像是混淆)。您还可以从静态 javascript 文件缓存中获得一些性能优势。

      如果您浏览网络,您会注意到最近在 Rails 博客中很少提及 RJS。这是因为 RJS 在 2006 年是一个热门想法,但随着 javascript 最佳实践的发展而被废弃。要理解这一点,您需要查看 AJAX 的历史。 Rails 是 2005 年首批内置 AJAX 支持的框架之一,它使用 Prototype 实现这一点,Prototype 确实是第一个现代 Javascript 框架,但边缘仍然相当粗糙。当时,大量的 Web 开发人员正在寻找任何方法来避免 Javascript,由于 DOM 不兼容,Javascript 名声不好。因此,人们有点过于渴望使用 Rails 助手来覆盖所有内容。当人们对非常简单的 AJAX 赞叹不已时,这很棒,但随着 Javascript 框架的成熟以及人们对 Javascript 功能的雄心壮志,很明显 Javascript 应该成为一等公民。如今,jQuery 使常见的 javascript 任务变得如此简洁和优雅,以至于早期的 Rails 助手即使在其默认功能正常工作时也显得笨拙。 RJS 可能仍然有一些很好的用例,但我已经很多年没有使用它了,我一点也没有错过它。

      我的建议是采用 Javascript。选择 Douglas Crockford 的 Javascript: The Good Parts,然后花大量时间使用 jQuery。你会得到丰厚的回报。

      【讨论】:

      • 完全同意 RJS 的衰落使用。这是一个聪明的主意,但在实践中我从不喜欢它。当然,现在很难让开发人员让他们所有的自定义 JS 不显眼……
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-03
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 2016-12-21
      • 2011-07-31
      • 1970-01-01
      相关资源
      最近更新 更多