Ruby / Rails:覆盖rails方法的正确方法?

时间:2012-05-08 16:57:24

标签: ruby-on-rails ruby rubygems gem monkeypatching

我正在创建一个rails gem,它为Rails的fields_for方法添加了功能,我希望它可以从任何表单构建器中调用。为了保持简洁,可继承(从form_for,nested_fields_for等)和向后兼容,我开始认为覆盖fields_for方法是最好的方法。

我之前没有这样做,我可以设想一些丑陋的问题。具体做法是:

  • 我需要在新的中调用原始的fields_for方法(通过alias_method)。如果Rails改变了该方法将来的工作方式,我猜我的gem会破坏所有fields_for功能(?)

  • 如果另一个gem覆盖fields_for,我怀疑我或其他gems的fields_for方法将被忽略(?)

  • 一般来说,覆盖现有rails方法的想法似乎很不合适。

我确信这是其他开发人员所面临的问题,我只是想知道 - 覆盖rails方法的标准方法是什么?在更好的开发者中间它是一个很大的禁忌吗?这种问题还有另一种方法吗?我是否应该尝试一下简洁,优雅的解决方案,然后使用不同的方法名称来完成它?

任何建议表示赞赏。

1 个答案:

答案 0 :(得分:3)

我会从simple_form和formtastic中获取一个页面,而不是覆盖你的方法。这两者都有效地改变了form_for方法,但是它们在顶层创建了一个新方法。

<%= simple_form_for @model do |f| %>
<% end %>

通过这种方式,您可以将form_for降级为您没有响应的所有内容,并与方法签名更改保持隔离。