2013-06-27 12 views
13

Ich habe ein Problem, die neue starke params Anforderung in Rails 4 mit Hstore und dynamische AccessorenSchienen 4 starke params + dynamische hstore Tasten

ich eine Hstore Spalte :content genannt haben zu überwinden, die ich verwenden möchte, Inhalte zu speichern in mehreren Sprachen, dh :en, :fr usw. Und ich weiß nicht welche Sprache im Voraus, um sie entweder im Modell oder im Controller zu setzen.

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

Wie kann ich starke Parameter (oder dynamische Hstore-Schlüssel) in Rails 4 für eine Spalte überschreiben?

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

Kurz von ...

params.require(:article).permit! 

natürlich die Arbeit macht.

+0

Wie sieht das Layout für diese dynamische hstore Daten aussehen? – parzival

Antwort

15

Wenn ich richtig verstehe, möchten Sie einen Hash der dynamischen Schlüssel aufheben. Sie können einige ruby Code wie folgt verwenden, dies zu tun:

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

Das ist für mich gearbeitet, hoffe, es hilft!

+1

Wie würde ich jeden Satz von Schlüsseln zulassen, anstatt Whitelisting. Zum Beispiel, wenn ich dem Benutzer erlauben möchte, seine Schlüsselnamen zu erstellen: Hier ist meine Frage: http: //stackoverflow.com/questions/19054535/setting-hstore-in-rails4-dynamic-key-values –

2

Ich mache etwas ähnliches und fand das ein bisschen sauberer und funktioniert gut.

ein Modell Unter der Annahme, genannt Article Sie zugreifen können Ihre :content indiziert stored_attributes wie folgt aus: Article.stored_attributes[:content]

So Ihre starke params wie folgt aussieht:

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

Ihre params Unter der Annahme, sind so strukturiert, wie: {article => {name: "", content: [en, fr, ..]}}

0

Wie gesagt, es ist nicht genug, den: content param zu erlauben - Sie müssen auch die Schlüssel im Hash zulassen . Halten Sie Dinge in der Politik, habe ich das so gemacht:

# 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 
Verwandte Themen