Dans Rails, quelle est la différence entre attr_accessor
et attr_accessible
? D'après ma compréhension, l'utilisation attr_accessor
est utilisée pour créer des méthodes getter et setter pour cette variable, afin que nous puissions accéder à la variable comme Object.variable
ou Object.variable = some_value
.
J'ai lu que cela attr_accessible
rend cette variable spécifique accessible au monde extérieur. Quelqu'un peut-il me dire quelle est la différence
ruby-on-rails
ruby
Felix
la source
la source
attr_accessor
est utilisé pour générer des méthodes getter et setter. Veuillez voir ma réponse à une question précédente pour une explication assez complète deattr_accessible
: stackoverflow.com/questions/2652907/… puis mettez à jour votre question si vous avez besoin d'autres détails spécifiques après cela.Réponses:
attr_accessor
est une méthode Ruby qui fait un getter et un setter.attr_accessible
est une méthode Rails qui vous permet de transmettre des valeurs à une affectation en masse:new(attrs)
ouupdate_attributes(attrs)
.Voici une affectation de masse:
Vous pouvez imaginer que la commande peut également avoir un code de réduction, par exemple
:price_off
. Si vous ne marquez pas:price_off
lorsqueattr_accessible
vous empêchez le code malveillant de pouvoir le faire:Même si votre formulaire n'a pas de champ
:price_off
, s'il est dans votre modèle, il est disponible par défaut. Cela signifie qu'un POST conçu pourrait toujours le définir. En utilisantattr_accessible
des listes blanches, les choses qui peuvent être affectées en masse.la source
attr_accessible
dans la documentation Rails? api.rubyonrails.orgattr_accessible
qu'unBeaucoup de gens sur ce fil et sur Google expliquent très bien qui
attr_accessible
spécifie une liste blanche d'attributs qui peuvent être mis à jour en masse ( tous les attributs d'un modèle d'objet ensemble en même temps ) C'est principalement (et seulement) pour protéger votre application de l'exploit pirate "Assignation de masse".Ceci est expliqué ici sur le document officiel de Rails: Mass Assignment
attr_accessor
est un code rubis pour créer (rapidement) des méthodes setter et getter dans une classe. C'est tout.Maintenant, ce qui manque comme explication est que lorsque vous créez en quelque sorte un lien entre un modèle (Rails) avec une table de base de données, vous n'avez JAMAIS, JAMAIS, JAMAIS besoin
attr_accessor
dans votre modèle de créer des setters et des getters afin de pouvoir modifier votre enregistrements de la table.En effet, votre modèle hérite de toutes les méthodes de la
ActiveRecord::Base
classe, qui définit déjà pour vous les accesseurs CRUD de base (créer, lire, mettre à jour, supprimer). Ceci est expliqué dans la doc officielle ici Rails Model et ici Overwriting default accessor (faites défiler jusqu'au chapitre "Overwrite default accessor")Disons par exemple que: nous avons une table de base de données appelée "utilisateurs" qui contient trois colonnes "prénom", "nom" et "rôle":
Instructions SQL:
J'ai supposé que vous définissiez l'option
config.active_record.whitelist_attributes = true
dans votre config / environment / production.rb pour protéger votre application contre l'exploit d'affectation de masse. Ceci est expliqué ici: Affectation en masseVotre modèle Rails fonctionnera parfaitement avec le modèle ci-dessous:
Cependant, vous devrez mettre à jour chaque attribut d'utilisateur séparément dans votre contrôleur pour que la vue de votre formulaire fonctionne:
Maintenant, pour vous faciliter la vie, vous ne voulez pas créer un contrôleur compliqué pour votre modèle utilisateur. Vous utiliserez donc la
attr_accessible
méthode spéciale dans votre modèle de classe:Vous pouvez donc utiliser la "route" (affectation de masse) pour mettre à jour:
Vous n'avez pas ajouté les attributs "role" à la
attr_accessible
liste car vous ne laissez pas vos utilisateurs définir leur rôle par eux-mêmes (comme admin). Vous le faites vous-même sur une autre vue d'administration spéciale.Bien que votre vue utilisateur ne montre pas de champ "rôle", un pirate pourrait facilement envoyer une requête HTTP POST qui inclut "rôle" dans le hachage des paramètres. L'attribut "role" manquant sur le
attr_accessible
est de protéger votre application contre cela.Vous pouvez toujours modifier votre attribut user.role seul comme ci-dessous, mais pas avec tous les attributs ensemble.
Pourquoi diable utiliseriez-vous le
attr_accessor
?Eh bien, ce serait dans le cas où votre formulaire utilisateur affiche un champ qui n'existe pas dans votre table d'utilisateurs sous forme de colonne.
Par exemple, supposons que votre vue utilisateur affiche un champ "veuillez-dire-à-l'administrateur-que-je-suis-ici". Vous ne voulez pas stocker ces informations dans votre table. Vous voulez juste que Rails vous envoie un e-mail vous avertissant qu'un utilisateur "fou" ;-) s'est abonné.
Pour pouvoir utiliser ces informations, vous devez les stocker temporairement quelque part. Quoi de plus simple que de le récupérer dans un
user.peekaboo
attribut?Vous ajoutez donc ce champ à votre modèle:
Vous pourrez donc faire un usage éclairé de l'
user.peekaboo
attribut quelque part dans votre contrôleur pour envoyer un e-mail ou faire ce que vous voulez.ActiveRecord n'enregistrera pas l'attribut "peekaboo" dans votre table lorsque vous effectuez un,
user.save
car elle ne voit aucune colonne correspondant à ce nom dans son modèle.la source
attr_accessor
est une méthode Ruby qui vous donne des méthodes setter et getter pour une variable d'instance du même nom. C'est donc équivalent àattr_accessible
est une méthode Rails qui détermine quelles variables peuvent être définies dans une affectation en masse.Lorsque vous soumettez un formulaire, et que vous avez quelque chose comme ça,
MyModel.new params[:my_model]
vous voulez avoir un peu plus de contrôle, afin que les gens ne puissent pas soumettre des choses que vous ne voulez pas.Vous pouvez faire en
attr_accessible :email
sorte que lorsque quelqu'un met à jour son compte, il puisse changer son adresse e-mail. Mais vous ne le feriez pasattr_accessible :email, :salary
car une personne pourrait alors fixer son salaire en soumettant un formulaire. En d'autres termes, ils pourraient se frayer un chemin vers une augmentation.Ce type d'informations doit être explicitement traité. Le supprimer du formulaire ne suffit pas. Quelqu'un pourrait utiliser Firebug et ajouter l'élément dans le formulaire pour soumettre un champ de salaire. Ils pourraient utiliser la boucle intégrée pour soumettre un nouveau salaire à la méthode de mise à jour du contrôleur, ils pourraient créer un script qui soumet une publication avec ces informations.
Il
attr_accessor
s'agit donc de créer des méthodes pour stocker des variables, etattr_accessible
de la sécurité des affectations de masse.la source
attr_accesible
:as
!class User < ActiveRecord::Base
attr_accessor
est un code rubis et est utilisé lorsque vous n'avez pas de colonne dans votre base de données, mais que vous souhaitez toujours afficher un champ dans vos formulaires. La seule façon de l'autoriser est de le faireattr_accessor :fieldname
et vous pouvez utiliser ce champ dans votre vue ou votre modèle, si vous le souhaitez, mais surtout dans votre vue.Prenons l'exemple suivant
Ici, nous avons utilisé
attr_reader
( attribut lisible ) etattr_writer
( attribut inscriptible ) pour accéder à l'objectif. Mais nous pouvons obtenir la même fonctionnalité en utilisantattr_accessor
. En bref, attr_accessor donne accès aux méthodes getter et setter.Le code ainsi modifié est comme ci-dessous
attr_accessible
vous permet de répertorier toutes les colonnes que vous souhaitez autoriser l'attribution en masse. L'opposé de ceci est ceattr_protected
qui signifie que ce champ, je ne veux pas que quiconque soit autorisé à assigner en masse. Il est plus que probable que ce sera un champ de votre base de données avec lequel vous ne voudrez pas que quelqu'un fasse le singe. Comme un champ d'état, ou similaire.la source
En deux mots:
attr_accessor
estgetter
, lasetter
méthode. alors queattr_accessible
c'est dire qu'un attribut particulier est accessible ou non. c'est tout.Je souhaite ajouter que nous devrions utiliser le paramètre Strong au lieu de nous
attr_accessible
protéger de l'affectation de masse.À votre santé!
la source
Un aperçu rapide et concis des différences:
la source