Frage

Kurze Zusammenfassung: Ich habe eine Rails-Anwendung, die eine persönliche Checkliste / To-do-Liste. Grundsätzlich können Sie sich einloggen und verwalten Sie Ihre To-do-Liste.

Meine Frage: Wenn ein Benutzer ein neues Konto erstellt, mag ich ihre Checkliste mit 20-30 Standard-to-do-Elementen füllen. Ich weiß, ich könnte sagen:

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...

Allerdings habe ich 20 ChecklistItem Reihen zu füllen, so dass 60 Zeilen sehr feucht (aka nicht DRY) Code wären. Es muss ein besserer Weg geben.

So will ich Samen aus einer YAML-Datei die ChecklistItems Tabelle verwenden, wenn das Konto erstellt wird. Die YAML-Datei kann haben alle meine ChecklistItem Objekte gefüllt werden. Wenn ein neuer Benutzer erstellt wird - bam! - die voreingestellte To-do-Elemente sind in ihrer Liste

.

Wie kann ich das tun?

Danke!

(PS: Für diejenigen von Ihnen, warum fragen, tue ich das. Ich mache einen Kunden-Login für meine Web-Design-Firma Ich habe eine Reihe von 20 Stufen (erste Sitzung, Design, Validierung, Test usw.), ich gehe mit jedem Web-Client durch. Diese 20 Schritte, um die 20-Checkliste Elemente, die ich für jeden neuen Kunden auffüllen möchten. während jedoch alle mit den gleichen 20 Elemente beginnt, ich normalerweise die Schritte anpassen ich auf das Projekt basiert giewen (und damit meine Vanille-to-do-Liste Implementierung und den Wunsch die Zeilen programmatisch zu füllen). Wenn Sie Fragen haben, ich kann weiter erklären.

War es hilfreich?

Lösung

Ich stimme mit den anderen Beantworter was darauf hindeutet, Sie tun es einfach in Code. Aber es muss nicht so ausführlich sein, wie vorgeschlagen. Es ist schon ein Motto, wenn Sie es wollen sein:

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

Werfen Sie, dass in einer Schleife von Elementen, die Sie aus einer Datei lesen oder in Ihrer Klasse speichern, oder wo auch immer:

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

oder wenn Ihre Einzelteile in der Komplexität erhöhen, ersetzen Sie das Array von Strings mit einer Reihe von Hashes ...

# 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

Aber ich bin nicht wirklich was darauf hindeutet, Sie alle Standardeinstellungen in einem konstanten Innen ChecklistItem werfen. Ich beschrieb es nur auf diese Weise, so dass Sie die Struktur des Ruby-Objekt sehen konnte. Stattdessen sie in einer YAML-Datei werfen, die Sie einmal eingelesen und Cache:

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

Oder wenn Sie Administratoren Stab der Lage sein, die Standardoptionen im laufenden Betrieb zu verwalten, setzen Sie sie in der Datenbank:

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

Es gibt viele Möglichkeiten.

Andere Tipps

Schreiben Sie einfach eine Funktion:

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)

Eine Rails-Befestigung wird verwendet, um Testdaten für Unit-Tests zu füllen; Denke nicht, daß es soll in dem Szenario verwendet werden, die Sie erwähnt.

würde ich sagen, nur eine neue Methode add_checklist_item extrahieren und mit ihm getan werden.

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

Wenn Sie mehr Flexibilität wünschen

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

Die Datei kann eine einfache Textdatei, in denen jede Zeile wie zu einer Aufgabenbeschreibung entspricht „Wash und Wachs des Ford F650.“. Sollte recht einfach in Ruby schreiben,

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top