我需要使用嵌套表单和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调用?
提前感谢;)
答案 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说得好: