ActiveSupport::Notifications 真实应用场景我只见过 rack-attack 用来记日志
https://github.com/kickstarter/rack-attack#logging--instrumentation
assets 是给希望把前端代码提升到一等公民地位的人用的,你把别人写好的模版文件整个导入,自己一点不想碰,并不想给予一等公民地位,当然不合适了。
解决方案:放到 public 里。
"单一职责"就是个伸缩尺,根据需要放大缩小。按照定义,Rails 的 Controller 就是不是单一职责的,因为每个 Controller 居然承担了某个资源的全部 CRUD,有时还有 Member / Collection 操作。那么这还要不要拆呢,这时候可以说服自己,CRUD 都属于操作单一资源,所以这是单一职责,于是心安了。看,这是不是文字游戏。标准库里面的类到底承担了多少职责,这时候应该选择视而不见。
当然也有贯彻落实“单一职责”,并把它作为设计哲学的人,于是搞出这样的代码:
class Show
include Lotus::Action
def call(params)
@article = Article.find params[:id]
end
end
这就是 Lotus 框架 http://lotusrb.org/ ,我刚看到的时候费解为什么会有人想写这种代码啊。别误解我,我觉得这个框架挺好的,喜欢这类风格的人就可以跟着去了,免得祸害 Rails。
后来读了 Steve Yegge 的《名词王国里的执行》(Execution in the Kingdom of Nouns),发现原来真的有人把 Java 社区批判过的东西当宝捡起来。这里的 call
不就履行了 execute
的职责吗?
TopicCommentCreator.new(topic, comment_params).execute
好,topic.comments.create(params)
坏。 —— 程序猿庄园戒律
得了吧,我编程的时候才不想着什么原则什么模式。如果一个类承担了太多工作,那就 提炼类;如果一个类做得事情太少了,那就 内联化类。要学习整理代码的技术,《重构》是本好书,它列出了一大堆模式,但不会列一堆框框条条让你一定要遵守,要具体情况具体分析。
当你一直往上把事情弄得太抽象,就会像上太空一样没有氧气。有时候这些聪明的思想家就是停不下来,然后就创造出这些荒唐又无所不包的高层次宇宙景像,这些东西什么都好,就是完全没有实际的意义。 —— Joel Spolsky,别让架构太空人吓到你
PS:新手应该多研究代码,少谈些模式,我推荐一个项目: https://github.com/rubygems/rubygems.org 。
#2 楼 @string2020 命令行输入 g++
看看,没有的话说明不包含在你安装的包内。
g++: Command not found
编译工具缺失,Ubuntu 通常是安装 build-essential 这个包把一波编译工具装上,Centos 不了解。
Rails 有 ActiveSupport::Notifications http://api.rubyonrails.org/classes/ActiveSupport/Notifications.html
你是 @mogodb 马甲么?你能停止 Troll 行为么?
YAML
原文没有 location 这个配置块。
在每个配置块 passenger 配置会清空,所以我怀疑是加了这个配置块导致的问题。
还有个问题我还没想好,不知道还有谁碰到这个需求:支持使用多个商户帐号 https://github.com/chloerei/alipay/issues/27
Ruby 线程有 GIL,可能与这个有关。
system :python, 'path/to/script.py'
从基础说起,可以用一个 Hash 对应一个 Person,一个 Person 数组就是:
persons = [ { name: '李xx', sex: '', tel: '' }, { name: '张', sex: '', tel: '' } ] # and more
数组(Array)内含了不少方法,其中的 inject 方法可以将数组遍历然后计算出一个结果,文档看这里 http://ruby-doc.org/core-2.2.1/Enumerable.html#method-i-inject ,对应你的需求就是:
persons.inject(Hash.new(0)) {|hash, person| hash[person[:name][0]] += 1; hash }
# => { '李' => 1, '张 => 1 }
解释一下,Hash.new(0) 创建一个空 Hash 用来存放结果(这个 Hash 每个 key 的默认值是 0),然后传到 inject block 里面;block 里面的 person[:name][0]
取到用户的姓,然后作为 key 找到 hash 的对应值 += 1;最后 block 要将 hash 作为结果返回作为下一次迭代的 hash 值,遍历完毕后 hash 就是你要的结果。
如果你希望 Person 成为一个类,方法差不多,代码变为:
class Person
# attr_accessor 定义了 getter setter 方法
attr_accessor :name, :sex, :tel
def initialize(attributes)
@name = attributes[:name]
@sex = attributes[:sex]
@tel = attributes[:tel]
end
end
persons = [ Person.new( name: '李xx', sex: '', tel: ''), Person.new( name: '张xx', sex: '', tel: '') ]
persons.inject(Hash.new(0)) {|hash, person| hash[person.name[0]] += 1; hash }
以上是 Ruby 的做法,你问到了 Rails 的做法,那么假设数据是存在数据库里的,并且使用了 ActiveRecord,那么可以通过数据库查询得出:
class Person < ActiveRecord
end
# PostgreSQL 语法
Person.select('substring(name for 1) as first_name, count(*)').group('first_name').map{ |person| [person.first_name, person.count] }.to_hash
#10 楼 @flowerwrong 继承 railtie 可以实现以下目标:
http://api.rubyonrails.org/classes/Rails/Railtie.html
目前只利用了它自动添加 lib/rails 目录下的 generator 这个功能。