2013-06-27 63 views
13
我有克服軌道4使用Hstore和動態存取

軌道4個強PARAMS +動態hstore鍵

我有一個Hstore列名爲:content,我要用來存儲內容的新強PARAMS需求的問題

在多種語言中,即:en, :fr等等。我不知道在模型或控制器中設置哪種語言。

store_accessor :content, [:en, :fr] #+226 random other il8n languages won't work. 

如何在一列中覆蓋rails 4中的強參數(或允許動態hstore鍵)?

params.require(:article).permit(
    :name, :content, 
    :en, :fr #+226 random translations 
) 

短...

params.require(:article).permit! 

這當然不工作。

+0

佈局如何爲這個動態hstore數據? – parzival

回答

15

如果我理解正確,您想將動態密鑰的哈希列入白名單。你可以使用一些ruby代碼如下做到這一點:

params.require(:article).permit(:name).tap do |whitelisted| 
    whitelisted[:content] = params[:article][:content] 
end 

這爲我工作,希望它幫助!

+1

我將如何允許任何一組密鑰,而不是白名單。例如,如果我想允許用戶創建他的鍵名稱:這是我的問題:http://stackoverflow.com/questions/19054535/setting-hstore-in-rails4-dynamic-key-values –

2

我正在做類似的事情,發現這有點乾淨,工作得很好。

假設一個叫Article您可以訪問模型的:content索引​​像這樣:Article.stored_attributes[:content]

所以你強PARAMS如下:

params.require(:article).permit(:name, content: Article.stored_attributes[:content]) 

假設你的PARAMS的構成就像:{文章=> {name:「」,content:[en,fr,..]}}

0

正如人們所說,僅允許內容參數是不夠的 - 您還需要允許哈希中的密鑰。保持在政策的東西,我這樣做是這樣的:

# in controller... 

    def model_params 
    params.permit(*@policy.permitted_params(params)) 
    end 

    # in policy... 

    def permitted_params(in_params = {}) 
    params = [] 

    params << :foo 
    params << :bar 

    # ghetto hack support to get permitted params to handle hashes with keys or without 

    if in_params.has_key?(:content) 
     content = in_params[:content] 
     params << { :content => content.empty? ? {} : content.keys } 
    end 
    end