7
votes

Rails 4 / Devise / MongoDB: "Paramètres non périmés" à l'aide de propriétés personnalisées et de paramètres forts

Essayer d'ajouter un attribut personnalisé imbriqué, Profil (document mongoïde), à ​​mon concevoir utilisateur . Lorsque le formulaire d'enregistrement du congé est soumis, il devrait créer à la fois un objet et un objet correspondant également.

J'aimerais que le résultat final ressemble à quelque chose Comme ceci dans mon MongoDB:

Utilisateur: xxx

XXX


Malheureusement, je reçois cela dans ma console chaque fois que je soumets mon inscription. Il crée un utilisateur avec succès mais ne parvient pas à créer un profil associé. xxx


J'ai configuré:

  • Rails 4.0.0Beta1, Ruby 2.0.0-P0
  • Devise («Rails4 'Branche), Mongoïde (de Git)
  • Un contrôleur d'enregistrement de congise personnalisé pour ajouter une définition pour les paramètres puissants.

    modèles / user.rb: xxx

    modèles / profil.rb: xxx

    contrôleurs / utilisateurs / enregistrements_controller.rb xxx

    routes.rb xxx

    J'ai déjà examiné ces postes liés, ils ne semblaient pas aider:

    • Rails 4 attributs imbriqués des paramètres non autorisés
    • https://gist.github.com/kazpsp/3350730

      EDIT:

      On dirait que le congé prend en charge des paramètres puissants dans sa branche "Rails4" (qui est censée être fusionnée en maître dans Quelques jours.) Vous regardez via le code, il semble que vous puissiez remplacer une fonction de paramètres pour chaque action sur les contrôleurs de congise. Pour créer de nouveaux utilisateurs, son signe_up_params au lieu de ressource_params dans mon exemple.

      malgré la modification de ce nom à la bonne, elle n'a toujours pas fonctionné ... Seuls que tous les paramètres utilisant ce bang semblaient fonctionner: xxx

      évidemment, ce type de défaite le but des paramètres puissants ... alors maintenant la question est de savoir comment Je permite mes attributs imbriqués profil_attributes (comme on le voit dans ma question originale)?


0 commentaires

4 Réponses :


11
votes

J'ai eu exactement le même problème et que SIGN_UP_PARAMS a travaillé pour moi XXX

Bien sûr, la différence est que la mine n'est que des valeurs scalaires, pendant que vous 'Re essayer de masse attribuer une relation ... Je suppose que c'est là que vous devriez rechercher.

Au fait, les documentations sont toujours inexistitions dans ce sujet (trop nouveau) et que les commissions de code suggèrent de remplacer devise_parameter_sanitizer , qui n'est pas nécessaire.


2 commentaires

Dans la classe héritante de Devise :: InscriptionsController , voici comment vous remplacez / prolongez-le


Oui, c'est le moyen de le faire ... pour les hashes (comme mon profil_attributes ), vous devez spécifier chaque attribut intégré explicitement par conception. c'est-à-dire quelque chose comme: param.require (: utilisateur) .permit (: email,: mot de passe,: mot de passe_confirmation, profil_attributes: [: first_name,: occupation_titer])



1
votes

J'ai utilisé votre code et cela a fonctionné pour moi!

Voici ce que j'ai fait xxx


0 commentaires

2
votes

J'ai eu le même problème lorsque vous vous connectez, il est écrit: Paramètres non autorisés: Mot de passe, mémoriser, mémoriser code>. Et parce que j'ai un contrôleur qui héritant , donc j'utilise mon propre Paramètre Sanitizer .

Voici ce que je fais: p>

créer un fichier dans '# {rails.root} / lib 'Fold, mon est hzsapa_parameter_sanitizer.rb code> et requis dans config / application.rb strand>, puis remplacer devise_parameter_sanitizer code> méthode dans Application_Controller.rb

ecestrong>lib/hzsapa_parameter_sanitizer.rbPe> Vous pouvez remplacer cette méthode dépend de votre problème: P >

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  def devise_parameter_sanitizer
    @devise_parameter_sanitizer ||= if defined?(ActionController::StrongParameters)
                                      HzsapaParameterSanitizer.new(resource_class, resource_name, params)
                                    else
                                      Devise::BaseSanitizer.new(resource_class, resource_name, params)
                                    end
  end
end


0 commentaires

4
votes

J'ai trouvé une méthode différente qui permet à tout la logique et du code d'élimination du congé à résident dans le contrôleur d'application . Cela permet de transmettre à tous les paramètres personnalisés à tous les paramètres personnalisés pour chaque action de congise (connexion, inscription, mise à jour). J'ajoute également un désinfectant de paramètre pour devise_invitable et gérer cette logique ici (inviter, accepter_invitation). J'ai des paramiques personnalisés comme avatar, avatar_cache, etc: xxx

trouvez et en savoir plus sur https://github.com/plataformatec/devise#strong-paramètres


0 commentaires