Mise à jour (4 décembre 2010):Rails: Conserver toutes les lignes ActiveRecord "validates" dans un fichier séparé?
Je réalise que chaque ligne validates
est en fait un appel de méthode (évidemment) afin de les exiger comme celui-ci ne faisait pas exactement comme je m'y attendais.
Cela fonctionne, mais je ne suis pas sûr qu'il est correct (saisir le nom complet de la classe Auction
):
class Auction::Validations
Auction.validates :status, :presence => true,
:inclusion => { :in => [
Auction::CREATING,
Auction::OPEN,
Auction::PENDING,
Auction::CANCELLED,
Auction::SUSPENDED,
Auction::EXPIRED,
Auction::CLOSING_COMPLETED,
Auction::CLOSING_WON,
Auction::COMPLETED,
Auction::WON,
Auction::NEGOTIATING,
Auction::IN_ESCROW
] }
Auction.validates :user, :presence => true
Auction.validates :url, :presence => true,
# FIXME: Move this to a URLValidator and do :url => true
:format => /^https?:\/\/[a-z0-9-]+(\.[a-z0-9-])*\.[a-z0-9]+\/.*/i
Auction.validates :title, :presence => true,
:length => { :maximum => 255 }
Auction.validates :description, :presence => true
Auction.validates :reserve, :numericality => { :greater_than_or_equal_to => :minimum_bid }
end
Lorsque cela est nécessaire (require 'auction/validations
) dans la classe Auction
, il fait la bonne chose.
Question originale suit:
Un couple de mes classes de modèle sont un peu encombré avec tous ces « valide » les appels, donc je pensais que je serais capable de les déplacer dans une catégorie distincte et « exigent » ça, mais ça ne semble pas marcher.
class Auction < ActiveRecord::Base
require 'auction/validations'
...
class Auction::Validations
include ActiveModel::Validations
validates :status, :presence => true,
:inclusion => { :in => [
... snip ...
] }
validates :user, :presence => true
validates :url, :presence => true,
# FIXME: Move this to a URLValidator
:format => /^https?:\/\/[a-z0-9-]+(\.[a-z0-9-])*\.[a-z0-9]+\/.*/i
validates :title, :presence => true,
:length => { :maximum => 255 }
validates :description, :presence => true
validates :reserve, :numericality => { :greater_than_or_equal_to => :minimum_bid }
validates_each :status, :on => :update do |auction, status_attr, value|
if auction.state_machine.current_state != value
# FIXME: Raise an Exception instead; this is a developer error, not a user error
auction.errors.add status_attr, "Status cannot be changed directly"
end
end
end
Il ne l'erreur pas, mais le validates_each n'exécute pas le bloc du tout (testé en ajoutant un puts "here"
), et le contrôle de numéricité ne fonctionne plus.
Avec le corps de cette classe copié aveuglément dans la classe de vente aux enchères à nouveau tout fonctionne. Est-ce que je ne comprends pas ce que le «besoin» va faire avec ces validations?
EDIT:
En fait, aucun des validations travaillent. Pas seulement ces deux-là. Hmmm.
Comme ceci: http://stackoverflow.com/a/27460841/115363 –