J'aimerais protéger une entrée générée par l'utilisateur dans un champ après sa création initiale. P>
Je demande à l'utilisateur un nom unique lorsqu'ils configurent un projet et je tiens à arrêter d'être modifiable après la création. P>
Y a-t-il un moyen de le faire dans des rails? Puis-je la définir comme Attr_Accessable au début, puis le basculer sur Attr_Protected? P>
acclamations p>
5 Réponses :
Je la définirais à: attr_protég et créer une nouvelle méthode "nouvelle":
Si je devais faire cela, je le ferai dans les clients finir avec Javascripts. Ex: Créez une fonction JavaScript qui définit l'attribut de la zone de texte à Readonly après l'utilisateur entré la valeur. Comme je peux le voir, c'est que le client a 2 avantages p>
1 - Vous ne voulez pas passer par un tour de serveur pour faire verrouiller la valeur 2 - Vous avez la flexibilité de permettre à l'utilisateur de changer la valeur s'il veut (en cliquant sur un bouton ou quelque chose) p>
acclamations p>
SAMEERA P>
-1 C'est un risque «de sécurité»;). Il peut être sécurisé sur le côté du client, mais il doit également être sécurisé sur le côté serveur
Vous pouvez également, si vous connaissez le nom des attributs, gérez-le dans le contrôleur
def create @my_model = MyModel.create(params[:my_model]) @my_model.super_cool = params[:my_model][:super_cool] unless params[:my_model].nil? if @my_model.save .. else .. end end
@klew - Soins Vous expliquez votre réclamation? Cela ne semble pas que ce soit un controlérant.
C'est une logique liée au modèle et il devrait rester dans le modèle. Si vous vous en souciez dans le modèle, vous pouvez l'utiliser dans vos contrôleurs sans y penser. Par exemple, votre code ne fera pas le travail s'il utilisera certaines formes imbriquées et enregistrera cet objet via un objet parent. C'est ce cas, vous devez ajouter plus de logique à vos contrôleurs pour connaître tous les cas possibles. N'oubliez pas de: modèle gras, contrôleurs maigres.
Vous pouvez ajouter une méthode de validation personnalisée à votre modèle:
# Project model validate :forbid_changing_name, on: :update private def forbid_changing_name errors.add :name, "can not be changed!" if self.name_changed? end
C'est un moyen intéressant de résoudre le problème; mes compliments. Vos personnes à voter sur cette réponse, moi-même incluse, semble contraire à l'esprit de si.
@Jesse: Ne le prenez pas personnellement. Je n'aime pas le vote de descente et je l'utilise seulement quand je pense que c'est vraiment une mauvaise réponse. J'espère que mon autre commentaire à votre réponse l'explique.
Merci Klew - C'est une solution que je ne penserais pas. Acclamations!
sa peine noter que comme des rails 3.2 validate_on_update: FOO, a été remplacé par Validate: FOO, ON :: Mise à jour
Pourquoi ne pas la définir pour être en lecture seule? La méthode attr_readonly code> vous permet de le faire, voir: p>
De la note vitale, comme l'API Docs spécifie: attr_readonly code> ne vous empêche pas d'attribuer à l'attribut au moment de l'exécution, mais plutôt l'ignore silencieusement i> lors de la sauvegarde. Au minimum, une erreur explicite peut être plus souhaitable que ce comportement. Une autre option souhaitable serait d'interdire l'écriture à elle quand ce n'est pas un nouveau record.