中文相对时间
迂回的实现了覆盖 helper 中的函数
终于搞定了 Chito 的相对时间插件,早就想实现这个插件了,不过一直没有想出好的实现方法,目前这方法虽然有点迂回,不过总体效果还是不错,也给以后的插件开发带来了很大的方便~
比如早先是用 post_time 这个 helper 来显示文章的发表日期的:
-
def post_time
-
@post.created_at.strftime("%Y年%m月%d日 %I:%M%p")
-
end
这样就显示的是诸如 '2008年1月1日 10:30AM' 这样的时间。
如果想改成显示相对时间,首先想到的就是覆盖这个方法,重定义 post_time 这个函数。不过目前 Chito 的插件方式和 Rails 的插件方式是一样的,都是在 vendor/plugins 目录下,也就是说,插件的函数要在主程序之前就被加载,这种方法行不通。
而且,即使可以成功覆盖,最初的 post_time 也就无法引用了,如果想在运行中切换显示正常时间和相对时间,就很麻烦了,除非覆盖前用 alias_method 把最初的 post_time 换个名字,否则没法引用到原来的函数。
最后决定使用这个方法,先定义一个 rewriter 函数:
-
def rewriter
-
caller_method = (caller[0] =~ /`([^']*)'/ and $1)
-
rewriter_method = "rewriter_of_#{caller_method}"
-
if @user.send("enable_#{rewriter_method}") && respond_to?(rewriter_method)
-
send(rewriter_method)
-
else
-
yield
-
end
-
end
然后把最初的 post_time 改成:
-
def post_time
-
rewriter{ @post.created_at.strftime("%Y年%m月%d日 %I:%M%p") }
-
end
这样,如果在插件中定义了 rewriter_of_post_time 这个函数,并且用户激活的显示相对时间的选项 ( @user.enable_rewriter_of_post_time 为 true ),就会显示相对时间,否则就显示最初的正常时间:
-
def rewriter_of_post_time
-
time_ago_in_words(@post.created_at) << '前'
-
end
有了 rewriter 覆盖其他的函数也方便了,只需加个 rewriter { ... } 就 OK 了,相当一个 hook 的作用,而且 rewriter_of_post_time 这个函数,从名字一眼就能看出是干啥的了~ 
把相对时间插件插件文件夹删掉,对 Blog 也没有影响,运行中只要改变 @user.enable_rewriter_of_post_time,就可以切换显示。
按照这种方式,下次尝试实现一下 header{ ... } 或者 footer { ... },在 helper 的内容前面和后面追加内容~ 
- 全局相关文章
-
- No match
- 相关文章
-
- No match
