【问题标题】:Ruby/Rails: The right way to override rails methods?Ruby/Rails:覆盖 rails 方法的正确方法?
【发布时间】:2012-05-17 04:40:47
【问题描述】:

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

虽然我以前没有这样做过,但我可以设想一些丑陋的问题。具体来说:

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

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

  • 一般来说,覆盖现有的 rails 方法的想法似乎很狡猾。

我确信这是其他开发人员面临的问题,我只是想知道 - 覆盖 rails 方法的标准方法是什么?在优秀的开发人员中,这是一个大禁忌吗?有没有另一种方法来解决这类问题?我是否应该放弃尝试一个简洁、优雅的解决方案并使用不同的方法名称来完成它?

任何建议表示赞赏。

【问题讨论】:

  • 您不需要为超类中的方法设置别名。就叫超级吧。 ruby super 在父类中调用相同的方法。

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


【解决方案1】:

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

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

通过这种方式,您可以将未响应的所有内容发送到 form_for,并与方法签名更改保持隔离。

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 2012-07-08
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多