2010-11-01 39 views
3

J'ai un formulaire imbriqué qui comprend une leçon/questions/réponses. L'utilisateur remplit les champs de réponse et clique sur Envoyer. Le hachage est illustré ci-dessous:Mise à jour des paramètres de hachage imbriqués. Mettre à jour l'action, ruby ​​sur rails

Parameters: {"commit"=>"Submit Answers", "action"=>"update", "_method"=>"put", "authenticity_token"=>"y##########o=", "lesson"=>{"questions_attributes"=>{"0"=>{"id"=>"1", "answer"=>{"response"=>"answertextanswertext", "user_id"=>"2"}}, "1"=>{"id"=>"4", "answer"=>{"response"=>"answertextanswertext", "user_id"=>"2"}}}}, "id"=>"1", "controller"=>"lessons"} 

Dans ma déclaration de mise à jour, je voudrais faire une boucle à travers les réponses et remplacer user_id pour des raisons de sécurité. J'ai modifié ma déclaration de mise à jour à ce qui suit:

def update 
    @lesson = Lesson.find(params[:id]) 
    lesson_params = params[:lesson] 
    for q in lesson_params[:questions_attributes].values 
     for s in q.values 
     if !s[:user_id].nil? 
      s[:user_id] = current_user.id.to_s 
     end 
     end 
    end 
    if @lesson.update_attributes(lesson_params) 
     flash[:notice] = "Answers submitted successfully." 
     redirect_to lessons_path 
    else 
     render :action => 'edit' 
    end 
    end 

Je suis un noob, si le hachage parcourait imbriquée était un peu d'essais et d'erreurs. Est-ce la façon appropriée de parcourir le hachage imbriqué? Est-ce un bon moyen de se protéger contre l'assignation de masse?

Merci, Alex

Répondre

0

Lorsque vous avez imbriqué des structures de données, en boucle sur eux est à peu près la seule façon de boucler sur eux. Que ce soit approprié ou non est une autre question. De manière réaliste, cela semble beaucoup de travail (même si c'est un travail assez simple) juste pour nettoyer vos ID utilisateur. Honnêtement, il semble beaucoup plus facile de simplement modifier la vue qui passe ces paramètres pour définir tous ces identifiants utilisateur à l'utilisateur actuellement connecté avant ils sont envoyés à votre contrôleur que de les boucler sur eux (en supposant que c'est une solution appropriée à tout problème de sécurité que vous essayez de résoudre).

En outre, vous pouvez en fait avoir des problèmes de portée avec (par exemple) q.values ​​- c'est un tableau qui est équivalent aux valeurs dans le hachage. La modification de s [: id_utilisateur] ne peut pas modifier les paramètres [: lesson] [: question_attributes] [0] [: user_id] (ou tout autre résultat).

En ce qui concerne la "protection contre l'assignation de masse", je ne suis pas sûr de savoir pourquoi vous êtes inquiet à ce sujet ici, pouvez-vous élaborer?