2011-08-08 3 views
1

J'adapte le système d'authentification du tutoriel Rails 3 de Michael Hartl pour mieux connaître les rails avant (très probablement) de passer à un système comme authlogic ou legs. Mon système d'authentification fonctionne très bien, et j'ai un modèle d'utilisateur qui inclut maintenant des champs qui construisent un profil d'utilisateur. Par exemple, les utilisateurs peuvent écrire un texte de présentation sur eux-mêmes, comme "joueur de tennis, grimpeur".Comment mettre à jour un seul champ d'un profil utilisateur dans Rails 3?

Ce que je voudrais faire est d'être en mesure d'avoir une forme simple qui met à jour uniquement ce domaine spécifique (« blurb »). J'ai mis en place sur une page de profil utilisateur où l'utilisateur clique sur un lien appelé "modifier" et cela rend un partiel pour afficher un formulaire avec un champ pour mettre à jour un blurb utilisateur en tant que tel:

dans _edit_blurb.html .erb:

<div class = "editforms"> 
<%= form_for current_user do |f| %> 
<div class="field"> 
    <%= f.text_field :blurb, :class => "inputform round", :placeholder => "blurb" %> 
</div> 
<div class="actions"> 
    <%= f.submit "Update", :class => "submit_button round mini_button" %> <br> 
</div> 
<% end %> 
</div> 

Cette forme se soumet à une action de mise à jour dans le contrôleur des utilisateurs, et pour la plupart met à jour le texte de présentation de l'utilisateur et rien d'autre. Cependant, un problème est que cette action de mise à jour soumet un mot de passe nul (car il n'y a pas de champ de mot de passe dans le formulaire) - conduisant à une modification du mot de passe de l'utilisateur. Ceci est problématique pour des raisons évidentes. À l'origine, j'ai ajouté une ligne: if => lamdba {new_record? || ! password.nil? } à la validation du mot de passe pour permettre la mise à jour partielle de edit_blurb sans avoir besoin de mot de passe. Mais, comme vous pouvez le voir, cela permet d'enregistrer un mot de passe nul.

validates :password, :presence => true, 
        :if => lambda{ new_record? || !password.nil? }, 
        :confirmation => true, 
        :length => { :within => 6..40 } 

Comment puis-je modifier soit la forme ou la validation (ou les deux) de sorte qu'un utilisateur peut mettre à jour un texte de présentation sans mise à jour/entrer son mot de passe (et fixant le mot de passe de remise à zéro mise à jour problème)?

Je pense avoir fourni le code correspondant, mais ajoutera plus si elle vous aidera! Merci tout le monde!

Répondre

2

ce que vous voulez faire est de prévenir le modèle d'utilisateur d'enregistrer le mot de passe lorsque la valeur du mot de passe est nul. Je ne sais pas comment votre modèle d'utilisateur est configuré, mais si vous avez suivi le railstutorial de MH, le mot de passe doit être sauvé par une méthode appelée:

before_save :encrypt_password 

dans User.rb. Pour résoudre ce problème, ajoutez:

before_save :encrypt_password, :if => lambda { !password.nil? } 

Cela devrait fonctionner.

Questions connexes