Rails 3:如何从js.erb文件中调用javascript函数

现在我已经升级到Rails 3,我正在试图找出分离和重用javascript片段的正确方法。 这是我正在处理的场景:


我有一个包含两个区域的页面:一个包含应该可拖动的元素,另一个包含droppables。

当页面加载时,我使用jQuery来设置draggables和droppables。 目前我在application.html.erb的头部有脚本,我确信这不是正确的解决方案,但至少可行。

当我按下页面上的按钮时,会向我的控制器发出一个ajax调用,用一组新的元素替换draggables,这些元素也应该是可拖动的。 我有一个js.erb文件,在正确的位置呈现部分。 渲染后我需要使新元素可拖动,所以我想重用当前存在于application.html.erb中的代码,但我还没有找到正确的方法来执行它。 我只能通过将代码直接粘贴到我的js.erb文件(yuck)中来使新元素可拖动。

我想要的是: – 包含函数prepdraggables()和prepdroppables()的javascript文件 – 从application.html.erb或js.erb文件调用函数的方法

我已经尝试使用:content_for来存储和重用代码,但似乎无法让它正常工作。


我目前在application.html.erb的head部分有什么

  $(document).ready(function () { // declare all DOM elements with class draggable to be draggable $( ".draggable" ).draggable( { revert : 'invalid' }); // declare all DOM elements with class legal to be droppable $(".legal").droppable({ hoverClass : 'legal_hover', drop : function(event, ui) { var c = new Object(); c['die'] = ui.draggable.attr("id"); c['cell'] = $(this).attr("id"); c['authenticity_token'] = encodeURIComponent(window._token); $.ajax({ type: "POST", url: "/placeDie", data: c, timeout: 5000 }); }}); });   

undo.js.erb

 $("#board").html(" 'shared/board', :locals => { :playable => true, :restartable => !session[:challenge]}) %>") // This is where I want to prepare draggables.  // assuming this file had the draggables code from above in a prepdraggables() function prepdraggables(); 

难道你不能把drag_drop_prep中的代码放到一个函数中,然后从application.html.erb和每个部分调用函数吗? 我猜我错了。

 function prepdraggables(){ // declare all DOM elements with class draggable to be draggable $( ".draggable" ).draggable( { revert : 'invalid' }); // declare all DOM elements with class legal to be droppable $(".legal").droppable({ hoverClass : 'legal_hover', drop : function(event, ui) { var c = new Object(); c['die'] = ui.draggable.attr("id"); c['cell'] = $(this).attr("id"); c['authenticity_token'] = encodeURIComponent(window._token); $.ajax({ type: "POST", url: "/placeDie", data: c, timeout: 5000 }); }}); } 

在application.html.erb和undo.js.erb中:

 prepdraggables();