2013-06-27 14 views
13

Sto avendo un problema superare il nuovo requisito params forte in Rails 4 utilizzando hstore e funzioni di accesso dinamicirotaie 4 params forti + chiavi hstore dinamiche

Ho una colonna hstore chiamato :content che voglio utilizzare per memorizzare i contenuti in più lingue, ovvero :en, :fr, ecc. E non so quale lingua in anticipo impostarli nel modello o nel controller.

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

Come posso ignorare params forti (o consentire per le chiavi hstore dinamici) in rotaie 4 per una colonna?

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

Breve ...

params.require(:article).permit! 

che ovviamente funziona.

+0

come si presenta il layout per questi dati di hstore dinamico? – parzival

risposta

15

Se ho capito correttamente, si desidera autorizzare un hash di chiavi dinamiche. È possibile utilizzare alcuni ruby codice come segue per fare questo:

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

Questo ha funzionato per me, spero che aiuta!

+1

come potrei consentire qualsiasi set di chiavi, invece di whitelist. ad esempio, se voglio consentire all'utente di creare i suoi nomi di chiavi: Ecco la mia domanda: http: //stackoverflow.com/questions/19054535/setting-hstore-in-rails4-dynamic-key-values –

2

Sto facendo qualcosa di simile e ho trovato che questo è un po 'più pulito e funziona bene.

Assumendo un modello chiamato Article è possibile accedere alla :content indicizzato stored_attributes come questo: Article.stored_attributes[:content]

Così i vostri params forti aspetto:

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

Assumendo che il params sono strutturate come: {article => {nome: "", contenuto: [en, fr, ..]}}

0

Come si è detto, non è sufficiente consentire il parametro: content - è necessario consentire anche le chiavi nell'hash . Mantenendo le cose nella politica, l'ho fatto così:

# 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 
Problemi correlati