Today's the day

向软件大牛炫耀我会焊单片机,向硬件大牛炫耀我会写 Rails,向软硬件大牛炫耀我生物,向软硬件生物大牛炫耀我会折腾期货 -_-bbb

中文相对时间
Ruby 数组转换成 Javascript 参数

迂回的实现了覆盖 helper 中的函数

galeki posted @ 2008年1月30日 15:27 in RoR with tags helper , 2714 阅读

终于搞定了 Chito 的相对时间插件,早就想实现这个插件了,不过一直没有想出好的实现方法,目前这方法虽然有点迂回,不过总体效果还是不错,也给以后的插件开发带来了很大的方便~

比如早先是用 post_time 这个 helper 来显示文章的发表日期的:

  1. def post_time
  2.     @post.created_at.strftime("%Y年%m月%d日 %I:%M%p")
  3. end

这样就显示的是诸如 '2008年1月1日 10:30AM' 这样的时间。

如果想改成显示相对时间,首先想到的就是覆盖这个方法,重定义 post_time 这个函数。不过目前 Chito 的插件方式和 Rails 的插件方式是一样的,都是在 vendor/plugins 目录下,也就是说,插件的函数要在主程序之前就被加载,这种方法行不通。

而且,即使可以成功覆盖,最初的 post_time 也就无法引用了,如果想在运行中切换显示正常时间和相对时间,就很麻烦了,除非覆盖前用 alias_method 把最初的 post_time 换个名字,否则没法引用到原来的函数。

最后决定使用这个方法,先定义一个 rewriter 函数:

  1. def rewriter
  2.     caller_method = (caller[0] =~ /`([^']*)'/ and $1)
  3.     rewriter_method = "rewriter_of_#{caller_method}"
  4.     if @user.send("enable_#{rewriter_method}") && respond_to?(rewriter_method)
  5.         send(rewriter_method)
  6.     else
  7.         yield
  8.     end
  9. end

然后把最初的 post_time 改成:

  1. def post_time
  2.     rewriter{ @post.created_at.strftime("%Y年%m月%d日 %I:%M%p") }
  3. end

这样,如果在插件中定义了 rewriter_of_post_time 这个函数,并且用户激活的显示相对时间的选项 ( @user.enable_rewriter_of_post_time 为 true ),就会显示相对时间,否则就显示最初的正常时间:

  1. def rewriter_of_post_time
  2.     time_ago_in_words(@post.created_at) << '前'
  3. end

有了 rewriter 覆盖其他的函数也方便了,只需加个 rewriter { ... } 就 OK 了,相当一个 hook 的作用,而且 rewriter_of_post_time 这个函数,从名字一眼就能看出是干啥的了~

把相对时间插件插件文件夹删掉,对 Blog 也没有影响,运行中只要改变 @user.enable_rewriter_of_post_time,就可以切换显示。

按照这种方式,下次尝试实现一下 header{ ... } 或者 footer { ... },在 helper 的内容前面和后面追加内容~

  • 无匹配
  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter