之前 1.9.3-p0 的时候试过这个补丁,效果很显著,但不敢在生产环境用,不知道有没有副作用……
另外很好奇,为什么每个版本的 ruby 都能冒出来一个鸡血补丁,这优化空间有这么大么??
我看到这个问题之后,打开 api.rubyonrails.org,搜索 scope,马上看到答案了,但由于那个页面是框架包着的,复制不到那个页面链接,所以就直接回了一句“看文档”,因为 Rails 只有两份文档:http://api.rubyonrails.org/ 和 http://guides.rubyonrails.org/,一个有目录,一个有搜索框,找起来并不难,这样的回答,不算偷懒吧?
#25 楼 @lgn21st 我翻了下 scope 方法的源码,我的理解是它把传入的 proc 定义成 model 的一个 class method 了?
# File activerecord/lib/active_record/scoping/named.rb, line 174
def scope(name, scope_options = {})
# 略去部分代码
scope_proc = lambda do |*args|
options = scope_options.respond_to?(:call) ? unscoped { scope_options.call(*args) } : scope_options
# 略去部分代码
end
singleton_class.send(:redefine_method, name, &scope_proc) # 注意 redefine_method 的使用
end
四级 655,六级 605. 高中就开始看英文技术书了,偶尔还会在英文邮件列表(comp.lang.c comp.lang.python)上讨论问题。
主要得益于我们高中的强悍的英语训练(高二的时候老师就拿四级的题给我们做练习)(另外身边那些 TOEFL/SAT 党的耳濡目染也很重要)
看文档……
今天更新了 carrierwave-upyun 的版本到 0.1.5,发现 @nowa 已经修复了这个功能~不过这次我发现了又拍云 API 的一个小问题:
通过 http://bitbucket-name.b0.upaiyun.com/file-path
访问图片文件时,content-type 正常,比如 image/jpeg
通过 http://v0.api.upyun.com/bitbucket-name/file-path
访问图片文件时,content-type 总是会返回 text/html,导致调用 recreate_versions!
重新上传图片文件时会把原先的 content-type 覆盖掉,在浏览器里访问图片文件会显示一堆乱码
话说我在又拍云的网站上找不到提交 ticket 的地方,联系客服貌似还要预约!?目前暂时的解决访问是 monkey-path 掉 CarrierWave::Storage::Upyun::File#content_type
这个方法:
class CarrierWave::Storage::UpYun::File
def content_type
'image/jpeg' # 我们会把所有图片都转成 jpg...
end
end
之前配了一个 Emacs 的 Rails 环境,不过用了几个星期觉得不爽,又继续用 Vim 了。Emacs 主要是 elisp 写起来很好玩,有兴趣看看: http://github.com/iwinux/emacs-config
@anklos 我觉得你的这个函数是最简单的实现,已经够用了,如果觉得 eval 不好看,换成这样试试:
# 不要叫 present?,会跟 Object#present? 重名
class String
def has_defined_class?
begin
!!self.classify.constantize
rescue NameError
false
end
end
end
'not_exist_class'.has_defined_class? # => false
'integer'.has_defined_class? # => true
Model.validators
这种问题其实只要开个 rails c
敲几个字母 TAB 几下就会找到答案的吧……要不翻源码也行……
有两种情况需要写代码注释:
以 Rails 的一段代码为例(来自 active_support/core_ext/array/grouping.rb)
# Splits or iterates over the array in groups of size +number+,
# padding any remaining slots with +fill_with+ unless it is +false+.
#
# %w(1 2 3 4 5 6 7).in_groups_of(3) {|group| p group}
# ["1", "2", "3"]
# 省略部分内容....
def in_groups_of(number, fill_with = nil)
if fill_with == false
collection = self
else
# size % number gives how many extra we have;
# subtracting from number gives how many to add;
# modulo number ensures we don't add group of just fill.
padding = (number - size % number) % number
collection = dup.concat([fill_with] * padding)
end
# 省略部分代码
end
最上方的注释属于第一类,中间部分的注释则是第二类。像 ruby-china 这种项目,本身没有提供什么公共模块,也不涉及特别复杂的逻辑,注释少是比较正常的吧~~
TomDoc 这只是个注释风格约定么?
我来跑个题……没有人围观 1 楼么 >。<
def respond_to?(message)
message = message.to_sym
[:__result__, :inspect].include?(message) ||
__result__.respond_to?(message)
end
最后那个 respond_to?
加上括号就好了。
Vim 党和 Emacs 党都弱爆了,我在 Emacs 里用 evil-mode(几乎完美模拟 Vim 按键)XDDDD
(举牌,这是笑话……)
貌似我用了 Rails 那么久一直都是用 attr_accessible,没有用过 attr_protected(我是看 Ruby on Rails Tutorial 这本书入门的,对我的编码风格影响很大)
#5 楼 @huacnlee 我在 Django 里模仿 Rails 写了个 mass-assignment 的东西,现在有点担心会不会有漏洞 = =
class BaseModel(db.Model):
protected_fields = []
def to_dict(self):
keys = self.fields().keys()
_dict = {}
for key in keys:
_dict[key] = getattr(self, key)
return _dict
def from_dict(self, _dict):
for field in self.protected_fields:
if field in _dict:
del _dict[field]
for key, value in _dict.iteritems():
setattr(self, key, value)
self.put()
目前最不爽的就是 Rails 的启动速度
请参考 The Ruby Programming Language Chapter 6.4.5 Block Arguments
[2] pry(main)> class Test
[2] pry(main)* %w(method_a method_b method_c).each do |name|
[2] pry(main)* define_method name do
[2] pry(main)* puts "I'm in method #{name}"
[2] pry(main)* end
[2] pry(main)* end
[2] pry(main)* end
=> ["method_a", "method_b", "method_c"]
[3] pry(main)> Test.new.respond_to? :method_a
=> true
[4] pry(main)> Test.new.respond_to? :method_b
=> true
[5] pry(main)> Test.new.respond_to? :method_c
=> true
[6] pry(main)> show-source Test.new.meth
Test.new.method Test.new.method_c Test.new.methods
Test.new.method_a Test.new.method_defined? Test.new.meths
Test.new.method_b Test.new.method_missing Test.new.meths=
[6] pry(main)> show-source Test.new.method_a
From: (pry) @ line 3:
Number of lines: 3
Owner: Test
Visibility: public
define_method name do
puts "I'm in method #{name}"
end
[7] pry(main)>