Pergunta

Breve resumo: Eu tenho um aplicativo Rails que é uma lista pessoal lista de verificação / para-fazer. Basicamente, você pode logar e gerenciar sua lista de afazeres.

Minha pergunta: Quando um usuário cria uma nova conta, eu quero preencher sua lista com 20-30 padrão itens a fazer. Eu sei que eu poderia dizer:

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

No entanto, tenho 20 linhas ChecklistItem para preencher, de modo que seria 60 linhas de muito úmido código (aka não seco). Tem que haver uma maneira melhor.

Então eu quero usar semente tabela de ChecklistItems de um arquivo YAML quando a conta é criada. O arquivo YAML pode ter toda a minha ChecklistItem objetos a ser povoada. Quando um novo usuário é criado - bam! -. A predefinição de afazeres itens estão em sua lista

Como posso fazer isso?

Obrigado!

(PS: Para aqueles de vocês perguntando por que eu estou fazendo isso:. Estou fazendo um login do cliente para a minha empresa de web design Eu tenho um conjunto de 20 passos (primeira reunião, design, validação, testes, etc.) que I passar com cada cliente web. Esses 20 passos são os 20 itens da lista de verificação que eu quero preencher para cada novo cliente. no entanto, enquanto todo mundo começa com os mesmos 20 itens, eu normalmente personalizar os passos que eu vou tomar com base no projeto (e daí o meu baunilha para fazer implementação da lista e desejo para preencher as linhas de programação). Se você tem perguntas, eu posso explicar melhor.

Foi útil?

Solução

Eu concordo com os outros answerers sugerindo que você apenas fazê-lo no código. Mas não tem que ser tão longos quanto sugerido. É já um um forro se você quer que seja:

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

Lance que em um loop de itens que você ler de um arquivo, ou armazenar em sua classe, ou onde quer que:

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 se os itens aumentam em complexidade, substituir a matriz de strings com uma série de 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

Mas eu realmente não estou sugerindo que você jogue todos os padrões em um ChecklistItem constante no interior. Acabei de descrever isso dessa forma para que você possa ver a estrutura do objeto Ruby. Em vez disso, jogá-los em um arquivo YAML que você lê uma vez e cache:

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

Ou se você varinha administradores para ser capaz de gerir as opções padrão na mosca, colocá-los no banco de dados:

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

Muitas opções.

Outras dicas

Basta escrever uma função:

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)

os trilhos de fixação é utilizado para testar-Preencher dados para testes de unidade; Não pense que está destinado a ser utilizado no cenário que você mencionou.

Eu diria que apenas extrair um novo método add_checklist_item e ser feito com ele.

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

Se você quiser mais flexibilidade

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

O arquivo pode ser um arquivo de texto simples, onde cada linha corresponde a uma descrição de tarefas como "Wash e encerar o Ford F650.". Deve ser muito fácil de escrever em Ruby,

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top