快速摘要: 我有一个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个步骤(第一次会议,设计,验证,测试等),我对每个网络客户端进行了检查。这20个步骤是我想为每个新客户填充的20个清单项目。但是,虽然每个人都从相同的20个项目开始,但我通常根据项目自定义我将采取的步骤(因此我的vanilla待办事项列表实现并希望以编程方式填充行)。如果您有疑问,我可以进一步解释。
答案 0 :(得分: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)
答案 1 :(得分: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编写,
答案 2 :(得分: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
但我并不是真的建议你把所有默认值都放在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
很多选择。