2016-10-11 1 views
1

Je souhaite créer un objet avec des paramètres forts pouvant accepter les clés de hachage dynamiques.Comment autoriser le hachage avec les valeurs * key =>?

Ceci est mon code,

Quiz.create(quiz_params) 


def quiz_params 
    params.require(:quiz).permit(:user_id, :percent, :grade, questions: {}) 
end 

données qui est passé dans ressemblerait à quelque chose comme ça.

// the keys that get passed into question is always different 

quiz: { 
    user_id: 1, 
    percent: 80, 
    grade: "B", 
    questions: { 
    "12": "24", 
    "1": "12", 
    "4": "3", 
    "5": "22" 
    } 
} 

Actuellement, lorsque j'essaie de créer un quiz, le hash des questions est vide.

Répondre

3

Jusqu'à présent je n'ai vu ceci:

def quiz_params 
    questions_params = (params[:quiz] || {})[:questions].keys 
    params.require(:quiz).permit(:user_id, :percent, :grade, questions: questions_params) 
end 
+0

(params [: quiz] || {}) [: questions] .keys –

+1

Pensez-vous que vous pouvez expliquer ce que cela fait exactement? Son genre de difficile à comprendre –

+0

Voir https://github.com/rails/rails/issues/9454 - malheureusement, il n'y a pas de moyen facile de dire "permettre à cette clé de contenir quoi que ce soit". La réponse de @ slowjack2k le fait manuellement: littéralement, vous permettez à la clé ': questions' de contenir une liste spécifique de clés, ce que vous obtenez en lui demandant toutes les clés qu'elle possède. Cela fonctionnera pour votre cas d'exemple, mais n'autorisera malheureusement pas l'imbrication arbitraire. – gmcnaughton

0

Avez-vous envisagé de changer votre place api?

quiz: { 
    user_id: 1, 
    percent: 80, 
    grade: "B", 
    answers_attributes: [ 
    { 
     question_id: "12" 
     value: "24" 
    }, 
    { 
     question_id: "3" 
     value: "12" 
    } 
    # ... 
    ] 
} 

Ce travail est ainsi à la fois form_for et nested_attributes. Au lieu de vous donner une potentielle vulnérabilité d'injection de masse - repensez votre modélisation de domaine. Tu peux faire mieux.

+0

Wow , Merci! Je n'y ai pas pensé. J'apprends encore: P –