看到老朋友 before_action
的手法 突然很感慨啊
老朋友了都 自然而然的看懂了为啥要放 private
下面了
继承
情景:本来大家都“继承”一个controller大类A的特征,然后各自都出现一样的代码重复.
解法:开一个新的controller(属于“次大类”吧)B,让controller B
继承 controller A
aka. “B 拥有 A的特征”, 然后再把重复的代码放controller B
中定义
最后让之前出现重复代码的那些“子controller”们 都来继承controller B. 这样就可以删掉他们中同样出现的那些重复代码了
真是机智啊,感觉就是“大类”底下再细分一个“次大类”,然后“次大类”中有更进一步的共享细节,就是在“不动最初的大类的前提下”更加细分的站队的手法
因为controller A这个大类很可能被更多其他的“子controller”们继承,不能轻易的改动 牵一发动全身啊
BTW 认真一想,这controller B
的命名也有讲究的,名字最好是概括了重复代码起到的作用. 代码的可读性也是很重要的啊啊啊
Mixin 找不到英文解释 估计是“mix-in”吧?
居然是module来的?附上module它的IT英文解释
a part of a computer or software system or program that has a function and works together with other related parts
还是concern来的?!所以这几个全互相关联?!到底啥关系啊这三?!
难道是...concern是model文档旗下专门放“module”们的“专属储藏间”吗?放在这个“专属储藏间”的module们能用include
被“跨境”式调用于各种model间?
而 ActiveSupport::Concern
则是在不光只需要用到“module”而且需要跟其他操作方法一起运作时,比如跟before_action
(它不是module)一起运作的时候,就需要靠ActiveSupport::Concern
把“不相干”的两者绑定使用?
而且感觉"mixin"跟"继承"的作用很类似啊,这俩又什么区别跟关联啊?我观察的代码区别如下
继承,开一个新“model” 直接把重复代码贴过去,然后把“需要去重复代码的model们”里改个“<”进行继承,最后能删光重复代码
Mixin,不是开新“model”而是开一个“model/concern”文档,不是直接贴上重复代码 而是重新定义一个“module”后再在其下贴上重复代码,“需要去掉重复代码的model们”里不是删光重复代码即可 而是需要添加一句“ include ‘新concern文档定义action的名词’ ” 才能调用
认真品味两种代码的区别
两者不同是 多出了一个区块
extend ActiveSupport::Concern
included do
before_create :generate_token
end
还值得注意的是,不管是用哪种手法对付“重复代码”,把重复代码抽取出来放进重新定义的文档里时,新文档的命名都一个套路,就是把重复的代码起到的效用给“言明”. 都是为了代码的可读性啊啊啊
穿越回来告诉你一下,接下来的教程会有解答~“而Inheritance则是继承class时会用到的”
Instance method 跟 Class method 的区别
One line summary 一言概之
Class methods are methods that are called on a class and instance methods are methods that are called on an instance of a class.
举个例子 一目了然
class Foo
def self.bar
puts 'class method'
end
def baz
puts 'instance method'
end
end
Foo.bar # => "class method"
Foo.baz # => NoMethodError: undefined method ‘baz’ for Foo:Class
Foo.new.baz # => instance method
Foo.new.bar # => NoMethodError: undefined method ‘bar’ for #<Foo:0x1e820>
认真品味这代码,Foo
是个 class
来的, 而在它之下定义的 def baz
就说明这个baz
是instance method
来的, Foo.new
is an instance of Foo
所以 def self.bar
就是为了跟baz
这个instance method区别开,带上了self
说明是个class method
就是命名为Foo
的class用的method
原来self是这样来的啊
这个例子还顺便直观的展示了“class”跟“instance”的区别 赞!!
带感的三个豆知识
-
So when would you use a class method?
Class methods are for anything that does not deal with an individual instance of a class. -
The key difference is instance methods only work with an instance and thus you have to create a new instance to use them (Foo.new)
-
destroy is an instance method.
class FoosController < ActionController
def destroy
foo = Foo.find(params[:id])
foo.destroy
redirect_to foos_url
end
end
另外 find是一个class method
更多细节看这 十多分钟能看下来的文章 文字语气亲切
http://www.railstips.org/blog/archives/2009/05/11/class-and-instance-methods-in-ruby/
网友评论