2013-06-27 2 views
13

は、私は店のコンテンツに使用する:contentと呼ばれるhstoreの列を持つhstoreのを使用して、レール4の新しい強力なのparamsの要件を克服する問題とダイナミックアクセサレール4つの強いのparams +ダイナミックhstoreのキー

を抱えていますつまり、:en, :frなどです。モデルやコントローラのどちらに設定するかは、どの言語を先に使うかわかりません。

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

どのように私は強いのparamsをオーバーライドする(または動的hstoreのキーを可能にする)ことができる1列のレール4で?ショート

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を同様に構成されていると仮定すると、
params.require(:article).permit(:name, content: Article.stored_attributes[:content]) 

:{品=>

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 
関連する問題