原文没有 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 这个功能。
#3 楼 @davidminaki 因为不知道你的源码,只能问你有没有做过什么特别的事了,例如在 Rails 载入前执行了什么代码。
User 类继承了什么类?
这个绿对我有些刺眼。
我想不到理由不用 production。
#21 楼 @scriptfans 我自己写的 plugin 是幂等的,如果原插件不幂等就加个 wrapper:
$(document).on 'page:change', ->
$('textarea[data-behaviors="editor"]').each ->
element = $(this)
if not element.data('editor')
element.data 'editor', element.editor()
提供几个模式:
1. 整站共享的逻辑,例如购物车:
$(document).on 'click', '.cart', ->
# code here
2. 特定元素存在的时候触发的逻辑,例如 editor:
$(document).on 'page:change', ->
$('textarea[data-behaviors="editor"]').editor() # a jquery plugin
3. 特定元素由用户触发的逻辑,例如 modal:
$(document).on 'click', '[data-toggle="modal"]', ->
# toggle modal
4. 某个页面特有的逻辑:
写到页面末尾,用内嵌形式。
<script>
// code here
</script>
现在不用操心 ready 了,page ready 是 jQuery 带来的思维方式,在 Turbolinks 环境需要另一种思维方式。无论最终是否用 Turbolnks,理解它,就会发现自己对浏览器如何执行 JavaScript 有更深的理解。
如果是前端开发者,应该比我更熟悉 Ember.js,Angular.js 这些框架,在这些框架生成的页面元素上要怎么操作 DOM 呢?Angular.js 的 FAQ 里面说,不要自己操作 DOM(Stop trying to use jQuery to modify the DOM in controllers.),为了打破习惯,还建议移除 jQuery(If you're struggling to break the habit, consider removing jQuery from your app.),这可不止要改变事件绑定的习惯。现在前端开发者可喜欢捣鼓新玩意了,我不担心他们。
某一天,我的 boss 蛋疼说要做桌面版 GUI,在前面的基础上,我可以直接把 service copy 过来用
你不会想前后端重复某些业务逻辑的。
这不是自相矛盾了么。
我没有阻止你加 Services 层,mkdir app/services
一条简单命令就实现了,但是在需求没出现的时候就加那么多层只会把问题搞得更复杂。service object 只是 Ruby object,Rails 框架不会也不能阻止你用。
我 7 楼说的是 js respond,不是 json。不过 json 也一样的,我不会在 html 以外的 respond 写 redirect_to。为什么?因为我测试过,每个 respond format 返回各种内容,例如 js 请求返回 3xx 响应会不会执行,json 请求返回 5xx 响应会不会解析,这在我学习 Rails 的很早阶段、刚知道 respond_to 这个方法的时候就测试过了。干了九年 Rails 开发才总结出这些问题我觉得不是值得炫耀的事。
顺便说说 js 请求重定向的方法:
// destroy.js.erb
// with Turbolinks
Turbolinks.visit('<%= resources_path %>');
// without Turbolinks
document.location.href = '<%= resources_path %>';
单单为重定向写个模版有点浪费,所以 Turbolinks 3.0 开始给 redirect_to / render 打了补丁,可以直接在 Controller 用 redirect_to / render https://github.com/rails/turbolinks/blob/4e9acc30ded75bb4fd88597b90eadcbf9c809545/lib/turbolinks/redirection.rb
如果充分理解 Rails 框架,自然可以将它扩展到各个场合,但如果大部分时间是在跟框架对抗,那么应该换框架了。我好奇楼主觉得现在哪个框架最先进?我有空参考一下学习它的长处。
1. 如果你需要可以 mkdir app/services
新建一个 service 层。
DHH 认为 Controller 就是 service 层,据我了解 DHH 从未建议把所有业务逻辑都写到 Model,所谓充血模型是一些文章一厢情愿。
要了解更多可以看这篇文章:Keep email views out of the models http://david.heinemeierhansson.com/2012/emails-are-views.html
2. 我觉得很奇怪,很多人愿意用一个前端框架重写整个应用,却不愿意了解 Turbolinks 的原理。(也许这是两个人群)
3. 从未在 js respond 写 redirect_to,因为知道这不会跟 http 请求一样响应,没觉得这是个问题。
以我阅读《Seven Concurrency Models in Seven Weeks》第一章了解到的,Java 线程需要程序员处理的问题一样有,然后作者再三强调用锁很容易出错,推荐用其它并发/平行模型。
除非内容经过本地化,不然不推荐用 url 参数(路径或参数),否则搜索引擎会索引很多重复内容。
url 参数 || 用户设置 || Accept-Language Header || default