Jun 29 2008

活动脚手架中文论坛开通

Tag: activescaffold, chinesecaoweiyuan @ 12:50 pm

上次发表了不喜欢回答初级问题,也怕宠坏程序员的帖子,有人在javaeye上提出如果单方面拒绝回答初级问题,会显得很狂妄。为此我为那篇文章中的令人不舒服的措辞抱歉。

另外,我们创建了一个google group用以讨论各种有关activescaffold的问题,欢迎新老朋友加入。也许有些问题,我太狂妄不屑回答,但是里面有精妙之处,欢迎别人回答,并指出我的愚蠢。而讨论过的问题,也可以在里面留个档,帮助以后有需要的人查阅。

从现在起,让我们使用这个google group来做有关讨论,汇总问题和解答。也请各位老朋友帮助回答各种问题,让这个group成为一个互相交流的community,而不只是一个大家问我答的helpdesk。谢谢!


Jun 19 2008

为什么javaeye上总有人问ActiveScaffold的初级问题?

Tag: activescaffold, chinesecaoweiyuan @ 11:33 pm

javaeye上有评分机制,如果帖子太过初级,会被评为新手贴,而在列表中隐藏。因为我订阅了javaeye上ruby版的RSS,所以即使隐藏的帖子也看得到。而很多新手贴是问关于ActiveScaffold的问题的,让我这个中文站站长颇为汗颜:为什么总有人问ActiveScaffold的初级问题?

对于这个问题,我想说三点。

第一,的确,ActiveScaffold很简单,很省事儿,但还没有简单省事到文档都不读就知道怎么做。  所以,问问题的人必须首先通读文档。我们已经把所有的文档都翻译成了中文,又降低了一点门槛,但我们不想宠坏程序员。技术的进步可以让开发者更有效率,更强大,而不是更懒,更傻瓜。

第二,虽然,我在javaeye开了个杂草丛生的blog,也在那里做过一次有关本站的广告,但那的确不是讨论ActiveScaffold具体问题的地方(更不是问初级问题的地方)。问有关ActiveScaffold的问题,请到这篇博文下面回复。

第三,再次重申,不要问傻问题,不要问文档里有的问题,不要问做ActiveScaffold时遇到的Rails基本问题。欢迎问经过思考的问题,欢迎分享你的创造性使用方法,扩展开发,和深度思考。对于“三不问题”,我们可能会回复,但是保留不予理睬的权利。对于好的问题和分享,我们会“来信选登”。

谢谢你对ActiveScaffold感兴趣,祝开发愉快。


Apr 30 2008

ActiveScaffoldExt之四:高级搜索

Tag: activescaffold, enterprise, plugincaoweiyuan @ 6:02 pm

简介

按字段搜索是ActiveScaffold的一个隐藏功能。虽然文档没有涉及(我们会在下面具体介绍用法),但是相信细心的用户已经发现了。ActiveScaffold缺省的搜索很有web应用程序风格,但是企业应用的话,按字段搜索更加普遍。它甚至还可以用来生成报表,对不对?这是我们当时选择ActiveScaffold的原因之一。

然而ActiveScaffold的按字段搜索做的不太地道,所有的字段都是文本输入框,而我希望看到像创建编辑界面那样丰富的表单项。通过这个扩展,你就可以做到:

  • 对于定义了form_ui=:select的字段,搜索表单项也是个下拉列表框。
  • 数字字段有了运算符,除了缺省的等于,还有>, >=, <, <=, !=,甚至还可以按范围搜索
  • 除了众望所归的日期范围(自定义),还有一些预设的区间,比如:今年,本季度,上个月等等。另外,为了配合报表图表功能,还有一个“趋势”区间,可以设定为“最近5周以来”这样的范围。

安装

请参考批量创建的安装。

用法

激活ActiveScaffold中的field_search功能:

config.actions.swap :search, :field_search

然后定义需要搜索的字段:

config.field_search.columns = :brand, :size, :created_at

假设你已经定义了某个belongs_to字段的form_ui为:select:

config.columns[:brand].form_ui = :select

并且日期字段的form_ui也必须是:calendar_date_select(需要安装calendar_date_select插件):

config.columns[:created_at].form_ui = :calendar_date_select

这样就搞定了。

Demo

还是用上次批量创建运动鞋的模型,为了演示日期范围搜索,我们加上了created_at字段。点那个搜索按钮,你就能看到惊艳的高级搜索界面了。

如果你已经svn update了最新的l10n_scaffold插件,会发现这个新功能的汉化也在其中了。


Apr 24 2008

ActiveScaffoldExt之三:过滤列表

Tag: activescaffold, enterprise, plugincaoweiyuan @ 5:43 pm

简介

在企业应用中常常有这样的要求,比如,同样一个业务列表,核价员要看到待审核状态和重新提交状态的,生产调度员要看到生产状态和采购状态的…业务员要看到所有状态的。他们都需要对业务列表进行过滤。过滤有时候是基于一个字段,比如业务状态,也可能会基于两个字段,比如业务状态和核准与否。这就是这个扩展要解决的问题。

市面上还有一个叫做activescaffoldlistfilters的插件可以参考,这是一个更通用的插件,把belongs_to关联中的所有可能性列出,给用户复选。

安装

请参考批量创建的安装。

用法

你可以为一个状态指定一个过滤选项,像这样:

config.list.add_filter "preparing", :status => "preparing"

你还可以把几个状态值放在一个过滤选项里,就像这样:

config.list.add_filter "processing", :status => ["placed", "processing"]

一个过滤选项的条件也可以是几个字段,就像这样:

config.list.add_filter "finished", :status => "processed", :verified => true

label选项给你用来指定显示的文本,如果不指定的话,它就会用这个过滤选项的name来做文本,一般中文项目都是需要指定一下的,就像这样:

config.list.add_filter "preparing", :label => "刚下单", :status => "preparing"

如果你需要给这些选项加上条件,比如哪些人可以看到什么,可以给list动作加一个before_filter,就像这样:

class OrdersController < ApplicationController
  before_filter :add_filter_options, :only => :index
  def add_filter_options
    active_scaffold_config.list.add_filter “preparing”, :status => “preparing”
    active_scaffold_config.list.add_filter “processing”, :status => [”placed”, “processing”]
    if current_user.has_role?(’moderator’)
      active_scaffold_config.list.add_filter “finished”, :status => “processed”, :verified => true
    end
  end
end

注:这往往需要和security功能配合使用。

这里面还有一个彩蛋功能──可以让浏览器记住你上次过滤的选项,自己来找找看吧。

Demo

这里是一个Demo,如果你已经svn update了最新的l10n_scaffold插件,会发现这个新功能的汉化也在其中了。


Apr 10 2008

ActiveScaffoldExt之二:多选列表和批量删除

Tag: activescaffold, enterprise, plugincaoweiyuan @ 12:21 pm

ActiveScaffoldExt之一我们介绍的是批量创建(batch_create)。那么当然也需要有一个批量删除。批量删除的首要条件是可以在列表里多选,这是在ActiveScaffold论坛中很多人希望有的功能。于是,我们的第二个扩展就来实现多选列表和批量删除。

简介

在列表中选中多个记录,批量执行一个动作(我们管它叫macro),这就是多选列表的功能。我们已经为批量删除定义好了一个macro,叫做“batch_destroy”,你可以直接用。如果你需要其他特殊功能,则需要在你的controller,或者ApplicationController里定义一个动作。

安装

请参考批量创建的安装。 

用法

controllers/sneakers_controller.rb

active_scaffold do |config|
  # 添加macro: 批量删除
  config.add_macro 'batch_destroy', :label => 'Delete', :method => :delete, :security_method => :delete_authorized?
end

config.add_macro的参数与config.action_links.add的参数(参考文档:api-action-link)类似,但是如果你设置了:type参数,则会被我们的缺省值:table覆盖,因为对于需要批量执行的macro命令,当然应该出现在列表的表头,而不是每个记录的右边。另外需要注意的是,批量删除的macro名称是batch_destroy,而不是batch_delete

Demo

这里是一个Demo,使用的是与批量创建相同的运动鞋的例子。如果你已经svn update了最新的l10n_scaffold插件,会发现这个新功能的汉化也在其中了。


Apr 02 2008

ActiveScaffoldExt之一:batch_create

Tag: activescaffold, enterprise, plugincaoweiyuan @ 5:21 pm

批量创建(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的汉化也在其中了。


Mar 28 2008

着手构建活动脚手架扩展

Tag: activescaffold, enterprise, plugincaoweiyuan @ 3:23 pm

产品基本上线了以后,开始有空将我们做的扩展开发剥离出来,共享成一个独立的插件。

这是一个功能列表:

  1. 批量创建 BatchCreate
  2. 扩展field_search,加入日期范围和数字运算符
  3. 可多选的列表
  4. 列表过滤器
  5. 发邮件
  6. 打印
  7. 专为AS配置的acts_as_trackable,记录所有修改
  8. fushion图表支持

由于这些功能大部分都会涉及模板覆盖(并且某些功能会修改同一个模板文件),所以我们会把他们做在一个插件中。但这并不意味着用户必须全盘接受这些功能,它们都可以通过在active_scaffold中配置来添加和删除这些功能。

这是项目主页:activescaffold-ext


Mar 12 2008

ActiveScaffold走向Rails2.0

Tag: activescaffold, railscaoweiyuan @ 11:54 am

最近的trunk代码显示ActiveScaffold正在开发支持Rails2.0的版本,这里是最近的svn log:

------------------------------------------------------------------------
r736 | edwin.moss | 2008-03-08 12:17:16 +0800 (Sat, 08 Mar 2008) | 1 line
Fix template_format
------------------------------------------------------------------------
r735 | edwin.moss | 2008-03-08 11:20:07 +0800 (Sat, 08 Mar 2008) | 1 line
OK, eventually, I will remove what needs removing.
------------------------------------------------------------------------
r734 | edwin.moss | 2008-03-08 11:09:46 +0800 (Sat, 08 Mar 2008) | 1 line
Oops, missed the r in rhtml.
------------------------------------------------------------------------
r733 | edwin.moss | 2008-03-08 11:06:02 +0800 (Sat, 08 Mar 2008) | 1 line
How did that left_handed get in there?
------------------------------------------------------------------------
r732 | edwin.moss | 2008-03-07 08:44:52 +0800 (Fri, 07 Mar 2008) | 1 line
Adopting Rails 2.0 - the beginning.
------------------------------------------------------------------------
r728 | rrwhite | 2008-02-25 10:22:10 +0800 (Mon, 25 Feb 2008) | 1 line
Moved the asset copying code out of install.rb and install_assets.rb. That way I
 could have init.rb call install_assets.rb every time the server is started with
out compromising the intent of install.rb (only run once). I also add an install
 counter to install.rb that "phones home" using a GET request so we can keep tra
ck of SVN installs. Feel free to edit my copy in install.rb that explains to the
 developer what and why we're doing with the install counter.
------------------------------------------------------------------------

所以,如果你想在Rails2.0的环境下使用ActiveScaffold,请跟踪trunk上的最新版本:

svn checkout http://activescaffold.googlecode.com/svn/trunk/ activescaffold

如果你像我一样还是留在Rails1.2系列版本中,可以:

svn checkout -r728 http://activescaffold.googlecode.com/svn/trunk/ activescaffold

或者,如果你使用svn:externals属性的话:

svn propedit svn:externals vendor/plugins
activescaffold -r728 http://activescaffold.googlecode.com/svn/trunk/

目前我们的工作,包括中文化、安装包和其他扩展程序,都没有在支持Rails2.0的版本中测试过,请谨慎使用。也欢迎你帮助我们做Rails2.0支持度的测试,谢谢。


Jan 13 2008

Introduce ActiveScaffold to ShanghaiOnRails (Jan 2008)

Tag: activescaffold, railscaoweiyuan @ 12:00 am

这是在ShanghaiOnRails第二次活动中做的Presentation。这里share的是第一个版本,比较详细。后来Jon建议我在演讲的时候做些Demo,这个建议很好,所以我把PPT改简单了,就是后来大家看到的。不过这第一个版本用来做会后的分享还是不错的,即使没去的朋友也能看得明白。

下面两个文件应bigapple的要求分享出来。before_as_demo是demo前的rails project,在demo做的改动发生以后,就是after_as_demo里面的rails project。

P.S. 这两个zip包中的相关插件是demo当天所用的版本,最新版本可以在首页获取。


Jan 10 2008

About ActiveScaffold.com.cn

Tag: activescaffold, chinese, ddd, enterprise, railscaoweiyuan @ 12:00 am

ActiveScaffold.com.cn即将上线。本网站将涉及以下几个方面的内容:
1. ActiveScaffold
介绍Rails的ActiveScaffold插件,以及文档中文化。
2. Enterprise Rails
Rails在企业开发中的应用。
3. DDD on Rails
使用Rails开发,可以更快捷地实现Domain Driven Design(领域驱动设计)思想。但是,这需要做一些基础工作,比如一些Rails插件,可以使各种设计模式易于实现。ActiveScaffold是一个很好的基础。

希望能对中国中小企业的软件应用、Rails社区特别是中文社区、以及DDD设计开发等做出贡献。