Monkey用Rails用业务逻辑修补核心类

时间:2018-11-30 13:45:21

标签: ruby-on-rails monkeypatching

我有ActiveRecord find的猴子补丁,其中包含一些业务逻辑,例如:

# lib/core_extensions/active_record/finder_methods/finder.rb
module ActiveRecord
  module FinderMethods
    def find(*args)
      return super if block_given?  

      #... business logic code =>  my_error_control = true

      raise "My Error" if my_error_control
      retorn = find_with_ids(*args)
    end
  end
end
retorn

我还没有看到很多这样的例子,这使我产生了疑问:

finder.rb应该在哪里?

在此示例中,此文件位于lib/core_extensions/...中,但是如果它包含业务逻辑,我认为finder.rb应该位于文件夹app/core_extensions/ 中不是吗?


在Sergio回答后编辑

这样的事情,是不好的做法吗?

# lib/core_extensions/nil_class/image_attributes.rb
# suport for product images attributes
class NilClass
  def main_image(size,evita_video)
    "/images/paperclip_missing/original/missing.png"
  end
end

2 个答案:

答案 0 :(得分:2)

这是我第一次看到这样的情况:)。我将其放在app/core_extensions中,并检查实时重载是否可以正常使用。如果没有,我将其移至lib/。 (这只是一种启发)

编辑:

我宁愿使用常规的NullObjects而不是扩展NilClass。确实不那么令人惊讶,更容易理解。

https://robots.thoughtbot.com/rails-refactoring-example-introduce-null-object

答案 1 :(得分:2)

  

finder.rb应该在哪里?

最终,没关系。只需加载此代码就很重要。修补基础库和添加业务逻辑的这种混合看起来必须被彻底记录(在项目的Wiki或类似的东西中)。如果有文档记录,那就没关系。代码就是文档所说的地方。

不建议使用,这是一个设计建议:

  

当用户寻找家族Family.find(params[family_id],session[:company_id])时,此发现将比较家族结果family.company与参数

的公司。

为什么不做这样的事情:

family = current_company.families.find(params[:family_id])

其中current_company可以定义为@current_company ||= Company.find(session[:company_id])

在这里,如果这家公司没有这个家族,您会遇到一个例外。

相同效果*,仅不进行任何修补。更具前瞻性。您甚至可以添加几个rubocop规则,以确保您永远不会写裸Family.find


*并非像您添加该补丁那样,其余代码都神奇地获得了超能力。否。您仍然必须更改所有查找者,以传递该公司ID。