【问题标题】:render partial using ujs and without AJAX call on rails 3在rails 3上使用ujs渲染部分并且没有AJAX调用
【发布时间】:2011-03-05 13:22:38
【问题描述】:

我需要使用嵌套表单和 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 调用?

提前致谢;)

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    whatever.js.erb:

    "$('#documents').append(' f)) %>);"

    (注意将 ruby​​ 代码插入到 erb 标签的字符串中的变化)

    现在你应该可以做到了:

    “随便” }, :remote => true %>

    代码会更加简洁,并且输出的 html 看起来会更好,因为现在那里没有任何 javascript。只需确保您的文档是 html5 并且包含 JS 库(因为您的代码有效,您可能会这样做:))。

    我自己正在使用 Prototype,但它在 JQuery 中应该没有什么不同。 我现在能想到的唯一弱点是将表单块传递给部分,但它应该可以工作,现在想得太晚了:)

    在此处发布它是否有效,如果无效,我们会弄清楚。现在晚安;]

    【讨论】:

    • 感谢您的回复。我的问题是我不会使用远程操作。我粘贴的代码在客户端工作,无需创建远程操作。我想用不那么突兀的东西来做同样的事情:P 顺便说一句,我会尝试不同的东西,以防万一我会在这里粘贴;)
    【解决方案3】:

    好的,抱歉,但我没有注意到您不想要 ajax 调用。我不太确定调用页面对象是否无论如何都不会进行调用。我认为要完全不使用 ajax 调用它,您必须在客户端以某种方式缓存该字段。您完全确定您的示例在没有 ajax 调用的情况下工作吗?

    如果我能想到的唯一让它“不那么突兀”的事情就是将 javascript 提取到 application.js 文件中,该文件用于存储您自己的 javascript,然后从您的视图中调用该函数。也就是说,如果您包含该文件 (application.js)。这只会将 javascript 从视图中移开,而不会改变代码的工作方式。

    干杯:)

    【讨论】:

    • 感谢您的回复。我认为缓存该表单并不容易,否则我可以使用 jquery 生成 html。我还尝试在标签之外使用一些 javascript,但它不起作用。但它也不适用于 ajax 调用。那是因为它需要 FormBuilder 实例......使用 rails
    【解决方案4】:

    这确实超出了我在嵌套表单和 UJS 方面的经验,但这里有另一个想法,尝试不将 FormBuilder 实例传递给部分。也许它会起作用。我见过奇怪的事情起作用。这可能是正确的,因为您将它呈现在该表单内,因此实例可能无需直接传递即可访问。如果这不起作用,那么需要比我更聪明的人来回答你的问题:)

    【讨论】:

    • 要通过不传递 FormBuilder 实例来完成这项工作,我应该使用适当的标签属性即时创建一个 ad hoc html 表单。它肯定会起作用,但它不干净:/谢谢你的回复;)
    猜你喜欢
    • 2011-03-22
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2013-03-15
    相关资源
    最近更新 更多