1

快速总结: 我有一个 Rails 应用程序,它是个人清单/待办事项列表。基本上,您可以登录并管理您的待办事项列表。

我的问题: 当用户创建新帐户时,我想用 20-30 个默认待办事项填充他们的清单。我知道我可以说:

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

但是,我有 20 个 ChecklistItem 行要填充,所以这将是 60 行非常潮湿(也不是 DRY)的代码。一定有更好的办法。

因此,我想在创建帐户时使用 YAML 文件中的 ChecklistItems 表作为种子。YAML 文件可以填充我的所有 ChecklistItem 对象。创建新用户时——bam!-- 预设的待办事项在他们的列表中。

我该怎么做呢?

谢谢!

(PS:对于那些想知道我为什么这样做的人:我正在为我的网页设计公司进行客户登录。我有一组 20 个步骤(第一次会议、设计、验证、测试等),我要经历每个 Web 客户端。这 20 个步骤是我要为每个新客户端填充的 20 个清单项。但是,虽然每个人都从相同的 20 个项目开始,但我通常会根据项目自定义我将采取的步骤(因此我的香草待办事项列表实现和希望以编程方式填充行)。如果您有问题,我可以进一步解释。

4

3 回答 3

3

只写一个函数:

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)
于 2009-05-11T11:12:26.887 回答
1

Rails Fixture 用于填充单元测试的测试数据;不要认为它是用来在你提到的场景中使用的。

我会说只是提取一个新方法add_checklist_item并完成它。

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

如果你想要更多的灵活性

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

该文件可以是一个简单的文本文件,其中每一行对应一个任务描述,例如“为福特 F650 清洗和打蜡”。应该很容易用 Ruby 编写,

于 2009-05-11T11:09:15.037 回答
1

我同意其他回答者建议你只用代码来做。但它不必像建议的那样冗长。如果您想要它已经是一个班轮:

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

将其放入您从文件中读取的项目循环中,或存储在您的班级中,或任何地方:

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

或者,如果您的项目复杂性增加,请将字符串数组替换为哈希数组...

# 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

但我并不是真的建议您将所有默认值放在一个常量 inside 中ChecklistItem。我只是这样描述它,以便您可以看到 Ruby 对象的结构。相反,将它们放入您读取一次并缓存的 YAML 文件中:

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

或者,如果您希望管理员能够即时管理默认选项,请将它们放入数据库中:

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

很多选择。

于 2009-05-12T15:08:52.823 回答