rails link_to_function帮助理解

时间:2014-03-10 09:33:47

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

我正在尝试维护一些相当旧的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文档中,我看到了一个消息签名:

  • 3.1.0 = link_to_function(name,function,html_options = {})
  • 2.2.1 = link_to_function(name,* args,&amp; block)

现在我不是100%确定这个代码是针对哪个编写的,但对我来说都没有多大意义,在我得到的代码中,我只能看到两个参数:

  • Arg1 ='text',
  • Arg2 =':class =&gt; “按钮....

我看不到其他逗号表示arg 3。

虽然因为这段代码以前工作得很好所以必须有一些我对Rails不了解的东西!

人们会建议如何使用JS在Rails中动态添加表单?

如果有人能够解释这段代码中发生了什么,那么这也很有用,因为我认为Rails dev的一些基本部分目前阻止我理解如何做简单的事情。

2 个答案:

答案 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>