Apr 02
ActiveScaffoldExt之一:batch_create
批量创建(batch_create)是我们从项目中抽象出来的第一个ActiveScaffoldExt,用以在一个表单中批量创建很多记录。
简介
假设我们有一个ActiveRecord的模型叫做Sneaker(运动鞋),有这么几个属性:品牌、尺寸、颜色,当然还有名称。品牌可能是Adidas、Nike或者别的,尺寸假设是7、8和9(英寸),颜色包括红蓝白。如果我们需要把这个排列组合里的每个情况都加入sneakers表,而又不想输入2×3x3次创建表单,那么你就需要用到这个批量创建功能。在我们编程提出DRY的口号的同时,我们软件的客户也同样希望不要做重复的机械性操作。在我们的项目中,有多个模型需要用到批量创建,比如物料列表,货架编号等等。有关实现这个功能的核心算法,我们已经在javaeye的一篇帖子中讨论过了。
安装
将activescaffold-ext安装到你项目的插件中,安装插件有很多方法,我们建议用svn propedit svn:externals vendor/plugins的方法,这样可以通过svn update保持与我们的开发同步,svn repository的地址是:http://activescaffold-ext.googlecode.com/svn/trunk/。然后,你还需要将frontends/ext/目录中的所有文件copy(或者merge)到你的app/views/active_scaffold_overrides目录中。这一步需要手工来做,你也许会觉得不太方便,那是因为如果你已经在active_scaffold_overrides里面做了一些模板覆盖的话,直接强行copy会搞乱你本来的开发,所以你需要手工做一个merge。
用法
models/sneaker.rb
belongs_to :brand
def to_s
"#{size}in #{brand} in #{color}"
end
controllers/sneakers_controller.rb
active_scaffold do |config|
# 以active_scaffold的语法定义create的columns
config.create.columns = :name, :brand, :size, :color
# 添加动作batch_create
config.actions.add :batch_create
# batch_create的字段会从create.columns自动继承
# 然后将那些需要批量输入的字段定义到batch_columns
config.batch_create.batch_columns = :brand, :size, :color
# 在batch_create里无需关注的字段(通常会在创建后自动生成,请看before_create_save)
config.batch_create.ignore_columns = :name
# 将关联字段的form_ui定义为select
columns[:brand].form_ui = :select
end
def before_create_save(name)
return if record.name
# 如果是从batch_create来的,则自动生成名称
record.name = record.to_s
end
batch_create也支持活动脚手架的表单覆盖,命名规则是:字段名_batch_form_column。比如,对于品牌选择框,我们希望如果一种品牌已经超过20种运动鞋,就将它隐去,那么我们可以在helpers/sneakers_helper.rb中定义一个brand_batch_form_column方法:
def brand_batch_form_column(record, input_name)
select_tag input_name + '[id][]', options_from_collection_for_select(
Brand.find(:all).select{|brand| brand.sneakers.count < 20},
"id", "name"), :multiple => true
end
Demo
这里是一个Demo,使用的就是上面运动鞋的例子。例子并没做汉化,相信大家都能看懂。如果你已经svn update了最新的l10n_scaffold插件,你会发现batch_create的汉化也在其中了。

04月 10th, 2008 at 12:21 pm
[…] ActiveScaffoldExt之一我们介绍的是批量创建(batch_create)。那么当然也需要有一个批量删除。批量删除的首要条件是可以在列表里多选,这是在ActiveScaffold的论坛中很多人希望有的功能,于是,我们的第二个扩展就来实现多选列表和批量删除。 […]
04月 24th, 2008 at 5:44 pm
[…] 请参考批量创建的安装。 […]