2017-07-22 6 views
0

Est-il possible de modifier l'objet Rails? Je veux seulement le modifier brièvement et le changer en arrière.Modification de l'objet Rails pour le processus d'amorçage

Mon raisonnement: J'essaie de travailler sur mon fichier de graines et de le rendre un peu plus robuste.

Dans mon modèle il y a un processus qui regarde le contrôleur actuel et l'utilisateur actuel, il suit cet utilisateur pendant la session.

Il génère une erreur lors de mes tests de démarrage, car il n'y a pas de session utilisateur basée sur le contrôleur.

Ce que je voulais faire était d'ajouter Rails.seed = true

au début de ma semence, il obtiendrait au modèle et dans le modèle que j'enveloppait un flux de contrôle (instruction if) de cette propriété autour de la bloc qui configure le suivi. Ensuite, je voudrais supprimer Rails.seed = true à la fin du fichier de départ.

+0

Si vous voulez un comportement différent entre le moment où vous exécutez les tests et l'exécution régulière, pourquoi ne pas utiliser une variable d'environnement? 'Rails.env ['semer']' – Andrei

Répondre

0

Je ne recommanderais pas nécessairement modifier la classe Rails mais pour atteindre ce que vous pourriez faire quelque chose comme:

class Rails 
    attr_accessor :seeding 

    def seeding=(bool) 
    @seeding = bool 
    end 

    def seeding? 
    @seeding ||= false 
    end 
end 

Ensuite, vous pouvez utiliser Rails.seeding = true pour définir et Rails.seeding? pour y accéder. De plus, il sera par défaut à false s'il n'est pas défini.

Une autre solution peut être d'enrouler la pièce qui souffle dans un bloc beingrescue pour intercepter l'erreur.

2

Au lieu de le mettre directement sur l'objet Rails, vous pouvez utiliser custom configuration

config/initializers/custom_config.rb (nom sans importance, juste dans un initialiseur)

Rails.configuration.seeding = false 

db/seeds.rb

Rails.configuration.seeding = true 

User.create 

app/modèles/user.rb

class User < ApplicationRecord 
    # just as an example 
    after_initialize do 
    if Rails.configuration.seeding 
     puts "Seeding DB" 
    else 
     puts "Normal" 
    end 
    end 
end 

sortie

$ bin/rake db:seed 
# Running via Spring preloader in process 19017 
# Seeding DB 
$ bin/rails c 
User.create 
# Normal 
# => #<User ...>