0

我有一个可以 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();"
4

2 回答 2

4

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

$(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
      }
    });

});
于 2010-01-15T05:27:56.833 回答
1

我同意弗洛伊德的观点。我通常处理这类事情的方式是从 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。你会得到丰厚的回报。

于 2010-01-15T06:37:41.623 回答