Ruby 板


LINE

※ 引述《ddman (ddman)》之铭言: : 觉得act_as_xxx很神奇,去找了一下,有两篇文章讲原理跟一个简单的template : 原理: http://tinyurl.com/275usq : template: http://textsnippets.com/posts/show/384 : 基本上是利用mixing来做。我得承认以我的程度,不是很了解...Orz : 有高手可以帮忙解释一下? 是不是想得太复杂了?我承认我没仔细看,(只翻了一下 code, 文章没看) 也跟 rails 不熟 XDDD 不过看起来大致上就是很单纯的 mixing. (只是绕了非常多圈,所以也许 ruby 不够熟可能会觉得混乱) ActiveRecord::Base.send(:include, MyMod::Acts::Roled) 叫 ActiveRecord::Base 去 include MyMod::Acts::Roled 这个动作,会触发: def self.included(base) # Add acts_as_roled availability by extending the module # that owns the function. base.extend AddActsAsMethod end 这是 ruby 本身的机制,当 module 被 included 时会呼叫的 hook, base 就是那个 mixer, 这里就会是:ActiveRecord::Base, 因为是他去 include Roled 於是就等同於呼叫 ActiveRecord::Base.extend AddActsAsMethod 所以 ActiveRecord::Base 就获得了:acts_as_random 这个 method, 接下来就可以这样: class MyModel < ActiveRecord::Base act_as_random end 因为 MyModel 继承 Base, 所以当然能用 Base 的 method acts_as_random 於是 MyModel 就会执行这段: class_eval <<-END include MyMod::Acts::Roled::InstanceMethods END 这简单地说就是很正常的 include, 所以 InstanceMethods 这个 module 就会被 include 到 MyModel 中,於是理所当然 MyModel 就能使用 这些 instance methods. 同时这段也会被执行到: def self.included(aClass) aClass.extend ClassMethods end aClass 就会是 MyModel, 因为是他去 include InstanceMethods, 然後他又被 extend ClassMethods, 所以 MyModel 也会获得这些 class methods. 以上只是随意的解释,也没细看该网站上的文章,所以如果有误望请指正 :) 不过我想应该没什麽错,因为我之前有稍微翻过 rails plugin 的作法, 有参考过一些 plugin 的大致作法,跟上面那样做还满像的。 不过老实讲,我个人觉得这样做还蛮多此一举的,绕了太多圈了,很麻烦。 除非需要做到很大的 plugin 吧?否则我觉得就一个 module 就好了。 顶多这样吧? module ClassMethods def class_method; 'class_method'; end end module InstanceMethods def instance_method; 'instance_method'; end; end class MyModel < ActiveRecord::Base include InstanceMethods extend ClassMethods end 嫌要 include 又要 extend 很麻烦的话: module MyPlugin def self.included base base.__send__ :include, InstanceMethods base.__send__ :extend, ClassMethods # 因为这些是 private methods end end 然後 class MyModel < ActiveRecord::Base include MyPlugin end 这样就好了,省得绕那麽多圈看得晕头转向的。 如果还是喜欢 act_as_... 的名字: def ActiveRecord::Base.act_as_me include MyPlugin end 就可以: class MyModel < ActiveRecord::Base act_as_me end 试试吧,我刚刚试了一下没什麽问题。 在 rails 中的话要考虑各 .rb 的执行顺序即可。 -- In Lisp, you don't just write your program down toward the language, you also build the language up toward your program. 《Programming Bottom-Up》- Paul Graham 1993 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.135.28.18
1F:推 ddman:我没深入研究ruby mixing,module跟继承,得花时间看看 11/03 21:57
2F:推 godfat:看 Programming Ruby 24 章:Classes and Objects 即可 11/04 09:23







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:e-shopping站内搜寻

TOP