2013-06-27 10 views
13

मैं Hstore और गतिशील accessorsरेल 4 मजबूत पैरामीटर + डायनामिक hstore कुंजी

मैं एक Hstore स्तंभ :content जो मैं सामग्री को संग्रहीत करने का उपयोग करना चाहते कहा जाता है का उपयोग कर रेल 4 में नए मजबूत पैरामीटर आवश्यकता पर काबू पाने में समस्या आ रही कई भाषाओं में, यानी :en, :fr, आदि। और मुझे नहीं पता कि कौन सी भाषा मॉडल या नियंत्रक में सेट करने के लिए आगे की ओर है।

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

मैं कैसे एक स्तंभ के लिए रेल 4 में मजबूत पैरामीटर ओवरराइड कर सकते हैं (या गतिशील hstore चाबी के लिए अनुमति देते हैं)?

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

के लघु ...

params.require(:article).permit! 

जो निश्चित रूप से काम करता है।

+0

लेआउट इस गतिशील हिस्टोर डेटा के लिए कैसा दिखता है? – 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- गतिशील-key-values –

2

मैं कुछ ऐसा कर रहा हूं और इसे थोड़ा क्लीनर और अच्छी तरह से काम करने के लिए पाया।

एक मॉडल कहा जाता Article आप उपयोग कर सकते हैं मान लिया जाये कि अपने :content अनुक्रमित stored_attributes इस तरह: Article.stored_attributes[:content]

तो अपने मजबूत पैरामीटर इस तरह दिखता है:

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

अपने पैरामीटर मान लिया जाये की तरह संरचित कर रहे: {लेख => {name: "", सामग्री: [en, fr, ..]}}

0

जैसा कि लोगों ने कहा है, यह अनुमति देने के लिए पर्याप्त नहीं है: सामग्री param - आपको हैश में कुंजियों को भी अनुमति देने की आवश्यकता है । नीति में चीजों को ध्यान में रखते हुए, मैंने ऐसा किया:

# 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 
संबंधित मुद्दे