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 13 2008

《Ruby on Rails电子商务实战》译者序

Tag: railscaoweiyuan @ 12:22 pm

《Ruby on Rails电子商务实战》[豆瓣] [卓越] [当当] 是我翻译的第一本书,在译者序中为本网站做了个广告,那么也在这里为这本书做个广告吧。

《Ruby on Rails电子商务实战》译者序

这是最重要的时间,也是了解未来的关键。这一事件的意义正如一万年前农业文明掀起了第一次浪潮,工业革命带来了惊天动地的第二次浪潮一样,我们是下一次浪潮变化“第三次浪潮”的子女。

——阿尔文·托夫勒,《第三次浪潮》

人类社会用了一万多年时间才来到第三次浪潮的前线,而在软件行业的几十年历史中已经悄然完成前两次浪潮的更替,向第三次浪潮推进。

第一次浪潮的软件开发就好像农业文明中盖房子,一砖一瓦都要靠自己。开发者要考虑通风排水(底层技术),力学支撑(系统强壮性);砖瓦的平整契合(代码可 读性); 进度的协调,什么时候装窗,什么时候上梁(开发流程管理);工程监理(QA)等等。 一套软件就像一件艺术品,充满了巧妙的构思,和完美的实现。那时候的开发者需要有木匠、泥水匠、铁匠、漆匠的等十八般手艺(各种编程语言的技巧),都必须 是能工巧匠。他们有自由发挥的余地,很有成就感,但是生产力很低。

第二次浪潮的软件开发就像在工业社会里造高楼大厦。高楼大厦的很多基础设施都做在了钢筋水泥的框架里面,包括总体结构、承重抗震、通风排水,消防安全等 等。而流行的软件框架(Framework) ,比如.Net,J2EE,也包括了底层支持、项目模板、开发规范、甚至一些基本功能。软件开发就是一个构建框架和内部装修的过程。开发者被分为程序员、 界面设计师、系统分析员、架构师、管理人员等等。每人只用一种手艺,负责一种工作,通过分工协作来完成任务。他们不需要知道所有的细节,也不需要是能工巧 匠,只要按照流程安全施工即可。第二次浪潮的软件开发很强,可以做出很复杂的系统,但是他们的开发者很可怜,没有一点儿自由。

Ruby on Rails掀起了软件开发的第三次浪潮,一个很小的团队就可以做出一套先进的Web系统。做软件就像玩乐高积木:需要支付功能,插上一块Payment gem(第9章),就把Paypal网站的所有功能集成进来了。需要目前流行的标签(Tag)功能,插上一个acts_as_taggable插件(第7 章),开发者只需要写几行代码即可。听上去像高科技一样的Ajax已经被集成到Rails中,所以给购物车加上拖放效果也只需要十几行代码(第5章)。本 书中最常用的句式就是“要完成A很简单,只需要……,要完成B也很简单,只需要……”。

第一次浪潮的艺术性被做入一块块乐高积木中,第二次浪潮工业品的精密通过每块积木的凸起和凹槽的契合来实现。第三次浪潮的开发者不需要很深入地了解复杂的框架,他需要的是一些搭积木式的编程能力,更需要一些创意。第三次浪潮的开发者更强,并重获自由。

在翻译这本书的同时,我辞去了研发部经理的职务,创建了activescaffold.com.cn网站。当然,是关于Rails的。创业的过程对我理解本书帮助很大。

致谢

这是我第一次翻译一整本书,期间碰到了各种意想不到的困难和挫折,能及时完成真是奇迹。感谢上帝帮助我完成这个翻译任务,更感谢他通过新的浪潮带给我的力量和自由,让我迫不及待地与读者们分享。

台湾著名的出版人博客老猫,在他的一篇博文中建议出版社编辑不要请短篇译者翻译一整本书,说那就像让一个短跑运动员跑马拉松一样。所以,特别感谢人民邮电出版社的傅志红编辑对我的信任,给了我这次“马拉松”的机会,以及翻译过程中不懈的指导。

衷心感谢我的家人,在翻译和创业的过程中,一直给予我支持和鼓励。特别是妻子刘英华,还担任了部分章节的审校工作。

感谢原书的作者Christian和Jarkko,写了一本像小说一样丝丝入扣引人入胜的技术书。虽然译者的翻译经验不足,技术水平有限,难免有些错误,但本书仍然值得推荐。也要感谢每一位阅读本书的读者,你们使我的工作有意义。

译者

2007年初秋

  • 致谢的第一段,因为我国出版政策原因,在实际出版中改为:“这是我第一次翻译一整本书,期间碰到了各种意想不到的困难和挫折,能及时完成真是奇迹。感谢赋予我爱和力量,不断鼓励我”忘记背后,努力面前”的人,使我最终坚持下来,直到最后完工。” 好吧,虽然好像在猜谜语,毕竟我能够对最重要的那位神表达了感谢。
  • 这篇译者序参考了两年前的一篇blog:后现代编程。喜欢ruby和rails也是因为我一直在等待这样的东西。

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当天所用的版本,最新版本可以在首页获取。


下一页 »