使用ujs部分渲染并且在轨道3上没有AJAX调用

时间:2010-06-18 17:47:03

标签: javascript ruby-on-rails jquery ruby-on-rails-3 unobtrusive-javascript

我需要使用嵌套表单和jQuery进行多个文件上传。所以我用link_to_function方法编写了一个帮助器:

  def add_document_link(title, form)
    link_to_function title do |page|
      form.fields_for :documents, Document.new, :child_index => Time.now.to_i do |f|
        page << "$('#documents').append('#{escape_javascript(render('/realties/document', :f => f))}');"
      end
    end
  end

此代码只是创建一个链接,如果按下该链接,则会呈现一个新的文件上载嵌套表单。即使我使用的是rails3 beta4(而且我知道'link_to_function'已弃用),令人惊讶也能正常工作

有没有更好的方法来做同样的事情而不使用link_to_function或一些AJAX调用?

提前感谢;)

5 个答案:

答案 0 :(得分:1)

如果它有效,那么唯一要做的就是通过将JavaScript调用移动到单独的whatever.js.erb文件来使其看起来更漂亮:

  

whatever.js.erb:

     

“$('#documents')。append('&lt;%= escape_javascript(render('/ realties / document',   :f =&gt; f))%&gt;);“

(注意将ruby代码插入到erb标签的字符串中的更改)

现在你应该可以做到:

   “whatever”},:remote =&gt; true%&gt;

代码将更加简洁,输出的html看起来会更好,因为现在没有任何javascript。只需确保您的文档是html5并且包含JS库(您可能在代码工作时执行此操作:)。

我自己正在使用Prototype,但它在JQuery中应该没有区别。 我现在能想到的唯一一个弱点就是将表单块传递给部分,但它应该可以工作,而且为时已晚:#/ p>

在这里发布是否有效,如果没有,我们会弄明白。现在晚安;]

答案 1 :(得分:1)

您可能想看看我的项目https://github.com/adamaig/complex-form-examples,该项目来自其他人的工作。相同的方法适用于rails 3(我刚刚在本地升级了项目以进行测试)。最大的问题是深层嵌套的元素,但是这个项目应该演示一种使用jquery和rails生成模板的ujs方法。

答案 2 :(得分:0)

好对不起,但我没注意到你不想要ajax电话。我不太确定调用页面对象是否仍然无法进行该调用。我认为完全没有ajax就可以调用它,你必须在客户端以某种方式缓存字段。你完全确定你的例子没有ajax调用吗?

如果确实这样做我能想到的唯一让它“不那么突兀”的是将javascript提取到application.js文件,这个文件用于存储你自己的javascript并且只是在你的视图中调用函数。那就是你包含那个文件(application.js)。这只会将javascript移离视图,而不会改变代码的工作方式。

干杯:)

答案 3 :(得分:0)

这真的超越了我对嵌套表单和UJS的体验,但是这里的另一个想法是尝试不将FormBuilder实例传递给partial。也许它会起作用。我见过陌生人的事情。这可能是正确的,因为您将其呈现在该表单中,以便可以在不直接传递实例的情况下访问该实例。如果这不起作用,那么需要比我更聪明的人回答你的问题:)

答案 4 :(得分:0)

参见RailsCasts第196和第197集

我为仅限链接的答案道歉,但没有人比Ryan说得好:

196. Nested Model Form Part 1

197. Nested Model Form Part 2