目前我具备了 Ruby 和 Rails 基础,基本的 Rails CRUD app 没有问题,扩充需求的时候通过搜索 gem 也能搞定,接下来就是提高了,我相信提高其中一条路便是学习别人的代码,因此我制定的计划是:
但这过程中我发现,即使是很简单的 gem,都用了大量 Ruby 或 Rails 的高阶知识,我现在想请教下大家这些高阶知识应该如何补呢?有没有啥书或者教程可以推荐的?或者什么技巧?
问题太宽泛了,我举个实际例子吧。
class ActiveRecord::Base
def self.record_activities(*actions)
#association
options = actions.extract_options!
if options[:dependent] or options[:association]
name = options[:association] || :activities
dependent = options[:dependent] || :nullify
has_many name, :dependent => dependent, :as => :subject, :class_name => 'Activity'
end
#action recording
actions = [:create, :update] if actions.empty?
actions.each do |action|
method = "record_activity_#{action}".to_sym
define_method method do
return unless self.class.record_userstamp
Activity.create(:actor_id => self.class.stamper_class.stamper, :subject => self, :action => action.to_s)
end
send("after_#{action}",method) if respond_to?("after_#{action}")
end
end
end
如上这段代码就这几行
extract_options!
就卡住了,Google 之,了解到这原来是 Rails ActiveSupport 中的一个方法,很多 Rails 的代码都有用到它。:association
这里又不明白了,如果调用这方法传入的参数中有:association
,则将其赋值给 name,然后就赋值:activities
?那调用者得传入个:association
作为 hash key 的参数?:activities
又是哪里来的呢?之前没有看到过呀,要怎么找到它是在哪里定义的呢?同理:nullify
define_method
貌似是在动态的创建方法?这是元编程的东西吧?以及send
和respond_to?
希望这个例子都让大家了解到我的问题所在,感谢你的指点 :)