Rails 3 - “link_to_function”方法的状态

时间:2011-02-21 07:11:28

标签: javascript ruby-on-rails

在搜索javascript问题的解决方案时,我在Rails 3中看到有关link_to_function被弃用的多条评论。但是,我已经能够使用{完成基于Rails-3的项目的一部分{1}}。它工作正常。

作为新的Rails,我担心的是我可能会使用长期不支持的东西,或者可能成为传统黑客。在查看api.rubyonrails.org时,我看到link_to_function在ActionView :: Helpers :: JavaScriptHelper模块中明确地被称为Ruby on Rails v3.0.4支持的公共方法。没有关于功能寿命的警告或其他声明。

我是否应该在Rails 3中使用其他方法/方法而不是link_to_function?或者link_to_function可以使用吗?

感谢。

3 个答案:

答案 0 :(得分:25)

link_to_function帮助已经deprecated again in 3.2.4

当您需要调用特定的javascript函数等时,该方法本身在某些用例中非常简单和好。您可以轻松添加自己的帮助程序以实现相同的功能。以下代码是在https://github.com/rails/rails/pull/5922#issuecomment-5770442

中从Jeremy复制的
# /app/helpers/link_to_function_helper.rb
module LinkToFunctionHelper
  def link_to_function(name, *args, &block)
     html_options = args.extract_options!.symbolize_keys

     function = block_given? ? update_page(&block) : args[0] || ''
     onclick = "#{"#{html_options[:onclick]}; " if html_options[:onclick]}#{function}; return false;"
     href = html_options[:href] || '#'

     content_tag(:a, name, html_options.merge(:href => href, :onclick => onclick))
  end
end

答案 1 :(得分:15)

<强> [更新]

正如TomH所提到的,在Rails 3.2.4中它是now deprecated again

[原始答案]

link_to_function 不再弃用可安全使用。详细说明:

link_to_function计划在Rails 3中删除(当Rails 3处于测试阶段时已暂停一段时间),但该函数被放回https://github.com/rails/rails/commit/d69e561。有几个人(大声地,在提交的评论中)想知道为什么函数被放回去,当Rails 3中的大推动是Unobtrusive JavaScript时,所以DHH插入:

  

这是为了处理非泛型函数   当你在ERb中明确触发   不倾向于手动挂钩   通过JS。 UJS的巨大胜利   Rails 3正在摆脱大片   样板代码ala数据确认   和数据远程。这些仿制药是   自动连接,你不必   打扰它。

     

但是对于你自己的职能,ala   link_to_function“添加日历”,   “Calendar.add()”,这是一个更多   直接,即时的方式去。如果你   仍然宁愿经历一个   外部JS并手动连接   通过dom:准备好,有一个实地日。

     

在Rails 3中对UJS的支持不是   关于教条。就像   对REST的支持不是。我们会曝光   每个人的主要价值然后   允许它所在的商店   以来。在这里,它是有道理的。

     

这,顺便说一句,不是关于原型或   任何其他特定的js框架。

答案 2 :(得分:2)

虽然我打算将所有内容转换为不引人注目的javascript,但是对我来说,一个很好的中间步骤是替换

link_to_function icon_tag('close.png'), '$(this).parent().hide()', :title => t('actions.close'), :class => 'close'

以下内容:

link_to icon_tag('close.png'), '#', :onclick => '$(this).parent().hide()', :title => t('actions.close'), :class => 'close'

很简单。希望这会有所帮助。