2015-11-20 91 views
0

我有它加載一個YML文件,分析它通過再培訓局,並在一個恆定的存儲結果散列一個初始化的訪問應用範圍在懶洋洋地定義常量一個Rails初始化程序

# config/initializers/links.rb 

LINKS = YAML.load(
    ERB.new(File.read(Rails.root.join("config", "links.yml"))).result 
) 

的原因ERB是在YML文件中的一些元素依靠URL幫手,需要模板 -

# config/links.yml 
--- 
footer: 
    homepage: 
    personal: <%= personal_path %> 
    root: <%= root_path %> 
    foo: bar 
    .... 

的問題是,當初始化運行時,會因爲Rails環境尚未初始化失敗,(我想?)所以這些幫助者定義不存在。

要解決的是,我懶洋洋地閱讀文件,所以它只被解析的時候,它被稱爲是第一次(這是我們加載了environment後大概)

# config/initializers/links.rb 

def links 
    unless defined? LINKS 
    links = YAML.load(
     ERB.new(File.read(Rails.root.join("config", "links.yml"))).result 
    ) 
    const_set("LINKS", links) 
    end 

    LINKS 
end 

但現在我因爲const_set不是已定義的方法,因此出現錯誤。

  1. 如何在此場景中設置常量?

  2. 此方法是否確保在第一次調用常量時全局定義常量(即應用程序範圍)?如果從視圖/控制器/模型/等調用links() ...我不希望該常量在該類的上下文中進行設置。

謝謝!

回答

1

我想,其原因爲使用的是性能,我覺得更好的是創建CacheStore一個輔助方法使用:

module LinksHelper 
    def links 
    Rails.cache.fetch("links_helper/links", expires_in: 1.hour) do 
     YAML.load(
     ERB.new(File.read(Rails.root.join("config", "links.yml"))).result 
    ) 
    end 
    end 
end 

,並在必要時並沒有,那麼你應該只包括這個幫手包括默認情況下。

+0

謝謝!我喜歡這種方法 - 我在哪裏定義「模塊」?也是爲了好奇,是否還有一種方法可以用我最初設定常數的方法來實現呢? – user2490003

+0

你可以像往常一樣將它放入app/helpers。當然,你可以用LINKS = YAML.load(ERB.new(File.read(Rails.root.join(「config」,「links.yml」)))result)來更改這個模塊的所有主體,除非定義? LINKS'來定義一個常量,但它會在每個請求中重新加載。我還沒有想法如何在具有可用輔助方法的初始化器中定義它。 – Mareq

相關問題