6
votes

Dans Rails, est-il un moyen de spécifier un type que vous souhaitez qu'un Attr_Accessor soit et la valider à l'aide de la validation des rails intégrés?

Je n'ai jamais pu trouver une bonne façon de le faire, alors j'ai pensé que je vous demanderais.

Par exemple, dans un modèle Activerecord, les attributs sauvegardés de la base de données sont automatiquement convertis dans la base de données appropriée. types sauvegardés. Si j'ai un modèle , et il dispose de quelques attributs, disons nom et catégorie_id , si je vais comme ça: xxx

rails sait que nom est une chaîne et catégorie_id est un entier.

disons que j'ai Plusieurs attributs transitoires / synthétiques que je veux valider, et ils ont des types spécifiques. Je veux les soumettre d'un formulaire, et j'aimerais qu'ils soient automatiquement convertis en une chaîne ou un entier ou une date (par exemple) basé sur la manière dont ils sont définis.

si je était de déclarer quelque chose dans un modèle de rails comme: xxx

existe une manière intégrée de raconter des rails "J'aimerais que vous lanciez le premier à un entier et à la ce dernier à une date, quand je vais catégorie.new (parames [: catégorie]) "Tant que parames [: catégorie] [: Certain_number_variable] et et [: Catégorie] [: Certain_date] Fait partie des données soumises au contrôleur (je réalise que l'exemple de date peut être un peu plus délicieux, étant donné les nombreux formats de date là-bas).


0 commentaires

6 Réponses :


1
votes

attr_accesor crée simplement des méthodes de lecteur / écrivain, et vient de RUBY , pas rails. La méthode des rails que je crois souvent confuse est attr_accesible qui sert Un but différent . Si vous souhaitez lancer lorsque l'attribut est lu, vous pouvez simplement remplacer le lecteur. XXX

Cela vous donnera au moins l'auteur gratuitement. C'est la meilleure solution que je connaisse pour quoi (je pense) que vous décrivez.

Edit: En ce qui concerne la validation, je pense que si vous utilisez des rails 3, ce sera beaucoup plus facile pour vous Pour effectuer une validation sur ce type d'attributs (je ne l'ai pas fait, je ne peux pas dire à coup sûr). Maintenant que les validations ne sont pas liées directement à Activerecord, je le croirais possible.


1 commentaires

Yup, je suis conscient que Att_Accessor est une méthode rubis, et je sais qu'Att_Accessable est de spécifier quels attributs permettent la masse de masse. Je pense que vous avez raison à propos des rails 3 - Étant donné que les validations se produisent maintenant en dehors de Aciverecord, il serait probablement plus facile de le faire.



0
votes

Je suppose par attribut "transitoire / synthétique" que vous voulez dire un attribut virtuel?

Si tel est le cas, il n'y a pas de fonction de rails intégrée qui fera cela que je peux penser à la permanence, mais une solution serait de simplement écrire un module pour ces attributs et l'inclure dans le modèle. Ou s'il devait être dynamique, vous pouvez appeler l'attribut quelque chose du genre: Quelque_variable_integer, puis gérez ces attributs dynamiques avec méthody_missing, lisez le nom de la méthode et le convertissez-le au type requis.

À mon avis, ce sont un peu désordonnés, alors les validations dans le modèle sont vraiment votre meilleure mise si ce que vous cherchez à faire peut les soutenir.


1 commentaires

Ouais - je veux dire virtuel, je suppose qu'ils sont tous pareils pour moi. Je pourrais certainement gérer la conversion et même la validation par une forme de métaprogrammation, mais je voulais savoir s'il y avait des choses intégrées qui manquaient.



0
votes

Aucune des réponses ne répond pas à la question. Je crois que la bonne réponse aux questions est simplement "non". Les réponses adressent les solutions de contournement potentielles au fait que la réponse à la question est «non», et les deux sont des commentaires / idées valides.


0 commentaires

0
votes

Utilisez avant_create ..

class Category
  attr_accessor :some_number_variable, :some_date
  before_create :validate

 private

   def validate
     return unless !!params[:category]
     #do variable casting here
   end
end


2 commentaires

Cela ne traite pas du tout à la question, ce qui est lié à la présentation automatique de rails tycédez l'attribut au type souhaité.


Ensuite, cochez cette réponse ... Stackoverflow.com/a/8940255/536984 ... Il s'adresse à l'écriture de son propre Attr_accesor .. Depuis Ruby Attr_Accessor, c'est juste pour définir des valeurs ... Son ne se soucie pas des types variables ...



0
votes

Ajoutez les éléments suivants à votre modèle:

columns_hash["birth_date"] = ActiveRecord::ConnectionAdapters::Column.new("birth_date", nil, "date")


0 commentaires

7
votes

AS des rails 5, il y a le API d'attribut que vous Peut utiliser comme ceci: xxx

Vous pouvez définir les valeurs par défaut et définir vos propres types, entre autres choses agréables. Ensuite, vous pouvez valider ces attributs (virtuels ou non) tels que n'importe quel autre db soutenu.


0 commentaires