今天,试图干掉一些代码,我提取了一些重复的 File.exists?几个辅助方法使用的代码转换为私有(private)方法def template_exists?(*template)
和猴子不小心修补了这个已经存在的 Rails 辅助方法。这是代码异味的一个非常明确的指标,我不需要任何继承的方法,但我继承了它们。此外,我的重构方法在这个助手中做了什么?
所以,这个助手做得太多了,因此违反了 SRP(单一职责原则)。我觉得 Rails 助手本质上很难保留在 SRP 中。我正在查看的 helper 是其他 helper 的父类(super class) helper,本身就有 300 多行。它是一个非常复杂的表单的一部分,使用 javascript 来掌握交互流程。 fat helper 中的方法简短而简洁,所以它不是那么糟糕,但毫无疑问,它需要关注点分离。
我该怎么出去?
正如我所看到的,没有 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/