原始代碼:我將如何重構此代碼使用特效?
def self.user_admin_links
ADMIN_PAGES.inject([]) do |result, page|
result << Page.new(controller: page[:name]) if page[:menu] && (page[:group_admin] || page[:company_admin])
result
end
end
def self.super_admin_links
ADMIN_PAGES.inject([]) do |result, page|
result << Page.new(controller: page[:name]) if page[:super_admin]
result
end
end
我試圖重構是這樣的:
array_builder = Proc.new do |conditional|
ADMIN_PAGES.inject([]) do |result, page|
result << Page.new(controller: page[:name]) if conditional
result
end
end
def self.user_admin_links
array_builder.call(page[:menu] && (page[:group_admin] || page[:company_admin]))
end
def self.super_admin_links
array_builder.call(page[:super_admin])
end
但我得到這個錯誤:
Error: undefined local variable or method `array_builder' for Page:Class.
當我打開array_builder成一個類的方法,如這個:
def self.array_builder
Proc.new do |conditional|
ADMIN_PAGES.inject([]) do |result, hsh|
result << Page.new(controller: hsh[:name]) if conditional
result
end
end
end
我收到了self.user_admin_links方法中「頁面」無法識別的錯誤。
這似乎是Ruby的濫用:)。必須有一個更優雅的方法。你最終想要完成什麼? – 2012-07-19 16:03:26
你正在嘗試抽象,這很好,但你做錯了。你所做的注入事實上是模擬列表理解,這就是你必須要抽象的東西。在Ruby中搜索有關列表理解的問題。 – tokland 2012-07-19 18:10:49