2009-10-09 9 views

Répondre

45

Vous voulez utiliser attr_readonly:

attributs répertoriés en lecture seule seront utilisés pour créer un nouveau record, mais les opérations de mise à jour ignoreront ces champs.

class Customer < ActiveRecord::Base 
    attr_readonly :your_field_name 
end 
+0

Ceci est la réponse correcte à votre question, mais la solution "correcte" à votre problème réel est un peu différente ... voir le commentaire sur l'autre question. – averell

+0

Sinon, +1 à la réponse. – averell

2

Ce champ est toujours et par définition « correcte » (à savoir une représentation exacte de la réalité) au moment de l'insertion?

Aucun utilisateur ne fait jamais une erreur lors de la saisie de ce champ pour la première fois (et dans votre schéma: seulement)?

+1

En fait, l'utilisateur n'entre pas du tout, c'est réglé par le contrôleur. Ce que je veux empêcher, c'est que quelqu'un le modifie en utilisant une post-requête modifiée. – fresskoma

+8

Dans ce cas, vous ne voulez pas du tout déranger avec des champs "readonly". Ce que vous voulez faire est d'utiliser l'instruction 'attr_protected' dans votre modèle pour éviter que le champ ne soit modifié par des mises à jour massives. Encore mieux: Utilisez 'attr_accessible' pour ne rendre disponibles que les champs sélectionnés pour les mises à jour de masse. – averell

+2

Pour canaliser ici: Je pense que le cas d'utilisation approprié de attr_readonly est lorsque la modification de ce champ briserait l'intégrité de vos données. J'ai un champ: valid_at, et changer ce champ ne devrait jamais arriver, car cela signifierait que quelque chose ne va vraiment pas avec les algorithmes de base. Si cela arrive, tout est sur le pont. Toutes les données pourraient être mauvaises. Par conséquent, je ne devrais jamais avoir besoin de le changer, et préfèrerais éviter qu'il soit modifié par un bug dans un autre code. Si jamais on essaie de changer, je veux exploser très fort. – Houen