2013-06-27 13 views
13

Mam problem przezwyciężania nową silną wymóg params w Rails 4 Korzystanie Hstore i dynamicznych akcesorówszyny 4 silne params + dynamiczne klucze hstore

Mam kolumna Hstore nazwie :content który chcę użyć do przechowywania zawartości w wielu językach, np. :en, :fr itp. I nie wiem, który język z góry, aby ustawić je w modelu lub kontrolera.

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

Jak mogę zastąpić silne params (lub pozwalają na dynamiczne klucze hstore) w szynach 4 na jednej kolumnie?

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

Short ...

params.require(:article).permit! 

co oczywiście działa.

+0

Jak wygląda układ dla dynamicznych danych hstore? – parzival

Odpowiedz

15

Jeśli dobrze rozumiem, chciałbyś umieścić na białej liście skrót klucza dynamicznego. Można użyć trochę ruby kod w następujący sposób, aby to zrobić:

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

ten pracował dla mnie, mam nadzieję, że to pomaga!

+1

w jaki sposób zezwolić na każdy zestaw kluczy, zamiast białej listy. na przykład, jeśli chcę zezwolić użytkownikowi na tworzenie jego nazw kluczowych: Oto moje pytanie: http: //stackoverflow.com/questions/19054535/setting-hstore-in-rails4-dynamic-key-values –

2

Robię coś podobnego i stwierdziłem, że jest nieco czystsze i działa dobrze.

Zakładając model o nazwie Article można uzyskać dostęp do :content indeksowane stored_attributes takiego: Article.stored_attributes[:content]

więc silne params wygląda następująco:

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

Zakładając swoje params są skonstruowane tak: {article => {name: "", treść: [en, fr, ..]}}

0

Jak już powiedzieli ludzie, nie wystarczy zezwolić na: treść paramu - musisz zezwolić na klucze również w haśle . Trzymanie rzeczy w polityce, zrobiłem tak:

# 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