我正在尝试维护一些相当旧的Rails代码(不是由我编写的),并且在一些我无法工作的非功能性javascript中苦苦挣扎。
它使用了link_to_function调用,我看到它已被弃用,我想知道人们使用什么作为替代品。
这是我要修复的代码:
link_to_function text, :class => "button new add_track" do |page|
track = render(:partial => 'track', :locals => { :f => form, :track => Track.new })
page << ""+
"var new_track_id = \"new_\" + new Date().getTime();"+
"$('.track_list').append(\"#{ escape_javascript track }\".replace(/new_\\d+/g, new_track_id) );"+
"tentracks.admin.ui.set_track_sort_order();"+
"tentracks.admin.ui.setup_track_image_managers();"
end
我基本上理解为什么意味着用户点击一个链接,然后将部分“轨道”表单附加到页面上,但我不知道这是如何使用函数'link_to_function'的。
从API文档中,我看到了一个消息签名:
现在我不是100%确定这个代码是针对哪个编写的,但对我来说都没有多大意义,在我得到的代码中,我只能看到两个参数:
我看不到其他逗号表示arg 3。
虽然因为这段代码以前工作得很好所以必须有一些我对Rails不了解的东西!
人们会建议如何使用JS在Rails中动态添加表单?
如果有人能够解释这段代码中发生了什么,那么这也很有用,因为我认为Rails dev的一些基本部分目前阻止我理解如何做简单的事情。
答案 0 :(得分:0)
看看这个结构:
do |page|
...
end
这是一个块。因此该方法具有Rails 2.2.1 link_to_function
方法的签名。
如果有人点击了该链接,则会评估该块内的javascript。在更新的Rails版本中,我希望通过绑定到链接的css类完全在Javascript中完成。
答案 1 :(得分:0)
使用您提供的详细信息,我打赌代码是用Rails 2.2.x编写的,因为link_to_function
仍然接受一个块。我记得必须覆盖rails 3中的帮助器以接受一个块。
有两个解决方案。第一个是将所有j放在一条长行中。
track = render(:partial => 'track', :locals => { :f => form, :track => Track.new })
js = "var new_track_id = \"new_\" + new Date().getTime();$('.track_list').append(\"#{ escape_javascript track }\".replace(/new_\\d+/g, new_track_id) );tentracks.admin.ui.set_track_sort_order();tentracks.admin.ui.setup_track_image_managers();"
link_to_function text, js, :class => 'button new add_track'
这是丑陋的解决方案。
使用Rails 3,像这样的阻碍javascripts已被劝阻。这就是你应该写它的方式。
link_to text, '', :class => 'button new add_track'
<script type='text/javascript'>
$('.add_track').click(function() {
var new_track_id = "new_" + new Date().getTime()
$('.track_list').append("#{escape_javascript render('track', :f => form, :track => Track.new)}".replace(/new_\\d+/g, new_track_id))
tentracks.admin.ui.set_track_sort_order()
tentracks.admin.ui.setup_track_image_managers()
})
</script>