7
votes

Définir un champ pour en lire uniquement dans les rails après sa création

J'aimerais protéger une entrée générée par l'utilisateur dans un champ après sa création initiale.

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.

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?

acclamations


0 commentaires

5 Réponses :


0
votes

Je la définirais à: attr_protég et créer une nouvelle méthode "nouvelle": xxx


0 commentaires

-1
votes

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

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)

acclamations

SAMEERA


1 commentaires

-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



-1
votes

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


2 commentaires

@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.



12
votes

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


4 commentaires

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



11
votes

Pourquoi ne pas la définir pour être en lecture seule? La méthode attr_readonly vous permet de le faire, voir:

Documents API


1 commentaires

De la note vitale, comme l'API Docs spécifie: attr_readonly ne vous empêche pas d'attribuer à l'attribut au moment de l'exécution, mais plutôt l'ignore silencieusement 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.