1

Résumé rapide: J'ai une application Rails qui est une liste de contrôle personnelle/à faire. Fondamentalement, vous pouvez vous connecter et gérer votre liste de tâches. Lorsqu'un utilisateur crée un nouveau compte, je souhaite remplir sa liste de contrôle avec 20 à 30 éléments de tâche par défaut. Je sais que je pourrais dire:Comment remplir une table dans des rails à partir d'un appareil?

wash_the_car = ChecklistItem.new 
wash_the_car.name = 'Wash and wax the Ford F650.' 
wash_the_car.user = @new_user 
wash_the_car.save! 

...repeat 20 times... 

Cependant, je dispose de 20 lignes de ChecklistItem à peupler, de sorte que serait 60 lignes de code très humide (aka pas DRY). Il doit y avoir un meilleur moyen. Je souhaite donc utiliser la table ChecklistItems à partir d'un fichier YAML lors de la création du compte. Le fichier YAML peut avoir tous mes objets ChecklistItem à remplir. Lorsqu'un nouvel utilisateur est créé - bam! - les tâches à faire prédéfinies sont dans leur liste.

Comment faire?

Merci!

(PS: Pour ceux d'entre vous qui se demandent pourquoi je suis en train de faire un login client pour ma société de conception de sites web, j'ai un ensemble de 20 étapes (première réunion, conception, validation, test, etc. Ces 20 étapes sont les 20 éléments de la liste de contrôle que je veux remplir pour chaque nouveau client, cependant, alors que tout le monde commence avec les mêmes 20 éléments, je personnalise normalement les étapes que je vais prendre en fonction de chaque client. projet (et donc ma mise en œuvre de liste de choses à faire et le désir de remplir les lignes par programme) Si vous avez des questions, je peux expliquer plus loin

Répondre

1

Je suis d'accord avec les autres answerers suggère que vous venez de le faire dans le code. Mais il ne doit pas être aussi verbeux que suggéré. Il est déjà une doublure si vous voulez qu'il soit:

@new_user.checklist_items.create! :name => 'Wash and wax the Ford F650.' 

Throw que dans une boucle d'éléments que vous avez lu à partir d'un fichier, ou stocker dans votre classe, ou où:

class ChecklistItem < AR::Base 
    DEFAULTS = ['do one thing', 'do another'] 
    ... 
end 

class User < AR::Base 
    after_create :create_default_checklist_items 

    protected 
    def create_default_checklist_items 
    ChecklistItem::DEFAULTS.each do |x| 
     @new_user.checklist_items.create! :name => x 
    end 
    end 
end 

ou si vos articles augmentent en complexité, remplacer le tableau de chaînes avec un tableau de hachages ...

# ChecklistItem... 
DEFAULTS = [ 
    { :name => 'do one thing', :other_thing => 'asdf' }, 
    { :name => 'do another', :other_thing => 'jkl' }, 
] 

# User.rb in after_create hook:  
ChecklistItem::DEFAULTS.each do |x| 
    @new_user.checklist_items.create! x 
end 

Mais je ne suis pas vraiment ce qui suggère que vous jetez tous les paramètres par défaut dans un intérieur ChecklistItem constant.Je viens de le décrire de cette façon afin que vous puissiez voir la structure de l'objet Ruby. Au lieu de cela, les jeter dans un fichier YAML que vous avez lu une seule fois et le cache:

class ChecklistItem < AR::Base 
    def self.defaults 
    @@defaults ||= YAML.read ... 
    end 
end 

Ou si vous Wand les administrateurs d'être en mesure de gérer les options par défaut à la volée, les mettre dans la base de données:

class ChecklistItem < AR::Base 
    named_scope :defaults, :conditions => { :is_default => true } 
end 

# User.rb in after_create hook:  
ChecklistItem.defaults.each do |x| 
    @new_user.checklist_items.create! :name => x.name 
end 

Beaucoup d'options.

1

Un Rails Fixture est utilisé pour remplir les données de test pour les tests unitaires; il est destiné à être utilisé dans le scénario que vous avez mentionné

Je dirais juste d'extraire une nouvelle méthode add_checklist_item et être fait avec elle.

def on_user_create 
    add_checklist_item 'Wash and wax the Ford F650.', @user 
    # 19 more invocations to go 
end 

Si vous voulez plus de flexibilité

def on_user_create(new_user_template_filename) 
    #read each line from file and call add_checklist_item 
end 

Le fichier peut être un simple fichier texte où chaque ligne correspond à une description de tâches comme « Lavez et cirez la Ford F650. ». Devrait être assez facile à écrire en Ruby,

3

Il suffit d'écrire une fonction:

def add_data(data, user) 
wash_the_car = ChecklistItem.new 
wash_the_car.name = data 
wash_the_car.user = user 
wash_the_car.save! 
end 

add_data('Wash and wax the Ford F650.', @user) 
+1

@ new_user.checklist_items.create! : name => 'Laver et cirer la Ford F650.' –

+0

encore mieux, je modise votre réponse. – MickaelFM

Questions connexes