2015-10-29 4 views
2

Ниже приведен фрагмент кода из проекта OpenProject с открытым исходным кодом. Я в недоумении от того, что делает этот рубиновый код, и прохождение рубиновой документации не помогло.Может кто-нибудь объяснить мне, как работает этот рубиновый синтаксис?

Метод управления вызывается кодом в инициализаторе, но я не уверен, что передается аргумент.

Использование отладчика, когда я смотрю на содержимое «элемента» в методе управления, он просто говорит:: block.

КАК кто-нибудь объяснить или передать мне какую-либо документацию, которая объясняет, как вызывается обращение?

require 'open_project/homescreen' 

    OpenProject::Homescreen.manage :blocks do |blocks| 
    blocks.push(
    { partial: 'welcome', 
     if: Proc.new { Setting.welcome_on_homescreen? && !Setting.welcome_text.empty? } }, 
    { partial: 'projects' }, 
    { partial: 'users', 
     if: Proc.new { User.current.admin? } }, 
    { partial: 'my_account', 
     if: Proc.new { User.current.logged? } }, 
    { partial: 'news', 
     if: Proc.new { [email protected]? } }, 
    { partial: 'community' }, 
    { partial: 'administration', 
     if: Proc.new { User.current.admin? } } 
) 
end 


module OpenProject 
    module Homescreen 
    class << self 
     ## 
     # Access a defined item on the homescreen 
     # By default, this will likely be :blocks and :links, 
     # however plugins may define their own blocks and 
     # render them in the call_hook. 
     def [](item) 
     homescreen[item] 
     end 

     ## 
     # Manage the given content for this item, 
     # yielding it. 
     def manage(item, default = []) 
     homescreen[item] ||= default 
     yield homescreen[item] 
     end 

     private 

     def homescreen 
     @content ||= {} 
     end 
    end 
    end 
end 

open_project/homescreen.rb

ответ

2

Доводы передается управление являются :blocks и блок.

yield, просто дает управление блоку, переданному в качестве аргумента.

yield вызывается с homescreen[item] где item равно :blocks.

Таким образом, yield просто пройдет homescreen[:blocks] к блоку.

код заканчивает делать это:

homescreen[:blocks].push (
    { partial: 'welcome', 
     if: Proc.new { Setting.welcome_on_homescreen? && !Setting.welcome_text.empty? } }, 
    { partial: 'projects' }, 
    { partial: 'users', 
     if: Proc.new { User.current.admin? } }, 
    { partial: 'my_account', 
     if: Proc.new { User.current.logged? } }, 
    { partial: 'news', 
     if: Proc.new { [email protected]? } }, 
    { partial: 'community' }, 
    { partial: 'administration', 
     if: Proc.new { User.current.admin? } } 
    ) 
+0

Спасибо. Мне пришлось перечитать некоторые праймеры на блоках, а также ваше объяснение, и я думаю, что он наконец нажал. Благодарю. – Agazoom