今天,试图干掉一些代码,我提取了一些重复的 File.exists?几个辅助方法使用的代码转换为私有(private)方法
def template_exists?(*template) 和猴子不小心修补了这个已经存在的 Rails 辅助方法。这是代码异味的一个非常明确的指标,我不需要任何继承的方法,但我继承了它们。此外,我的重构方法在这个助手中做了什么?

所以,这个助手做得太多了,因此违反了 SRP(单一职责原则)。我觉得 Rails 助手本质上很难保留在 SRP 中。我正在查看的 helper 是其他 helper 的父类(super class) helper,本身就有 300 多行。它是一个非常复杂的表单的一部分,使用 javascript 来掌握交互流程。 fat helper 中的方法简短而简洁,所以它不是那么糟糕,但毫无疑问,它需要关注点分离。

我该怎么出去?

  • 将方法分成许多助手?
  • 将 helpers 方法中的代码提取到类中并委托(delegate)给它们?您会确定这些类的范围(即 Mydomain::TemplateFinder)吗?
  • 将逻辑分成模块并在顶部将它们列为包含?
  • 其他方法?

  • 正如我所看到的,没有 2 比意外的猴子补丁更安全。也许是组合?

    代码示例和强烈的意见表示赞赏!

    最佳答案

    将辅助方法提取到类中(解决方案 n°2)

    好的,以解决这种清理助手的特定方式 1st 我挖出了这个旧的 railscast :

    http://railscasts.com/episodes/101-refactoring-out-helper-object

    当时它启发我创建了一个小标签系统(在我的一个应用程序中与状态机一起工作):

    module WorkflowHelper
    
      # takes the block
      def workflow_for(model, opts={}, &block)
        yield Workflow.new(model, opts[:match], self)
        return false
      end
    
      class Workflow
        def initialize(model, current_url, view)
          @view = view
          @current_url = current_url
          @model = model
          @links = []
        end
    
        def link_to(text, url, opts = {})
          @links << url
          url = @model.new_record? ? "" : @view.url_for(url)
          @view.raw "<li class='#{active_class(url)}'>#{@view.link_to(text, url)}</li>"
        end
    
      private
        def active_class(url)
          'active' if @current_url.gsub(/(edit|new)/, "") == url.gsub(/(edit|new)/, "") ||
                     ( @model.new_record? && @links.size == 1 )
        end
    
      end #class Workflow
    end
    

    我的观点是这样的:
      -workflow_for @order, :match => request.path do |w|
        = w.link_to "✎ Create/Edit an Order", [:edit, :admin, @order]
        = w.link_to "√ Decide for Approval/Price", [:approve, :admin, @order]
        = w.link_to "✉ Notify User of Approval/Price", [:email, :admin, @order]
        = w.link_to "€ Create/Edit Order's Invoice", [:edit, :admin, @order, :invoice]
    

    如您所见,这是将逻辑封装在一个类中并且在助手/ View 空间中只有一个方法的好方法

    关于ruby-on-rails - 清理胖 rails 助手,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7079425/

    10-14 06:53