Извлечение вспомогательных методов в классы (решение № 2)
хорошо, чтобы обратиться к этому конкретному способу очистки помощников, 1-й я выкопал этот старый 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]
Как видите, это хороший способ инкапсулировать логику в классе и иметь только один метод в пространстве помощника / представления