继承自 DeviseController
class Devise::RegistrationsController < DeviseController
DeviseController 继承自 ApplicationController,parent_controller 方法返回字符串"ApplicationController",constantize 转成类名。
class DeviseController < Devise.parent_controller.constantize
....
end
module Devise
...
# The parent controller all Devise controllers inherits from.
# Defaults to ApplicationController. This should be set early
# in the initialization process and should be set to a string.
mattr_accessor :parent_controller
@@parent_controller = "ApplicationController"
...
end
也就是说它是 ApplicationController 的扩展,为了让我们使用 Devise 起来更顺手,在中间加入了大量的魔法,使得 Devise 和 Rails 一样的 automagical。
Devise 是个巨坑,想理解推荐先看大神 José Valim 的书《Crafting Rails 4 Applications》,我也正在学习中。。。
#10 楼 @qinfanpeng 这个例子确实举的不好,定义有点多余。我的原意是在 Model 里这种方式提取属性值,不用数字,类似这样。
class Conversation < ActiveRecord::Base
enum status: [:active, :waiting, :archived]
scope :not_active, -> { where("status <> ?", Conversation.statuses[:active]) }
end
``
这个我也用过,尽量不要用数字,直接用 Hash 来访问。
class Conversation < ActiveRecord::Base
enum status: [:active, :waiting, :archived]
scope :select_active, -> { where(:status => Conversation.statuses[:active]) }
scope :select_deleted, -> { where(:status => Conversation.statuses[:waiting]) }
end
#12 楼 @rubyist518 哈哈,感谢,看完了,玩了个
Array.new(3) { [1, 2, 3] }.tap {|array| puts "Array.new: #{array}"}
.flat_map { |n| n + [4]}.tap {|array| puts "flat_map: #{array}"}
.bsearch { |n| n > 3 }.tap {|n| puts "result <=> 4: #{n <=> 4}"}
楼主,能不能别偷懒,应用场景和使用技巧补补齐啊,这样我才能领会。
ruby-china 的分页只能查看前 69 页,也是出于性能考虑吗?我一直在看老帖子啊。
Class 和 Module 本质上来说,区别不大,在 kernel 中以同一个 C 结构体来维护。
struct RClass {
struct RBasic basic;
VALUE super;
rb_classext_t *ptr;
struct method_table_wrapper *m_tbl_wrapper;
};
大致上来说这么一个结构
为了解决 Ruby 不存在多重继承的问题,Matz 给 Ruby 引入了 Mixin,具体用 Module 来实现。然而实现的方法很简约,就是直接把 Module 插入到 class 的祖先链里。
所以直接把 Module 理解为 Class,include 就是多重继承也无妨。比如有三个 Class,人、猫、狗都继承自动物这个 Class,现在想写一些所有宠物共用的代码。由于猫、狗是从动物继承过来的,所以这两个类不能再继承宠物这个类,也不可能在这两个类里独立封装这些方法。这时就写一个 Module 叫做宠物,让猫和狗这两个 Class 把这个 Module Mix 进去就可以了。
当然实际的使用中,即使是不复用的代码也可以使用 Module。把一个复杂问题拆解后,分成不同的 Module,然后一起 Mixin 到一个 Class,形成一个 Huge Class,这也是经常使用的技巧。
PS:图来自《Ruby Under a Microscope》,坛里有大神正在翻译,期待赶紧出版。
很难说用了 Module 类中那些方法实现了 module_funciton 功能,因为 module_funciton 是用 C 语言来写的,并没有调用其他方法。基本上这个 C 函数就是检查参数,查找参数里的方法名在 module 中是否存在。然后用这一句
rb_method_entry_set(rb_singleton_class(module), id, me, METHOD_VISI_PUBLIC);
将这个 instance_method 注册为 class_method。所以说 define_method 和 instance_method 两者互相独立,不存在相互调用关系,而且两者的功能完全不一样。define_method 是直接定义方法,而 module_funciton 是将本来在 module 里的 instance_method 绑定为 class_method,好通过 Module 名直接调用。
好文章!
感谢,终于不用再翻墙用 google 搜索站内了
确实,长度明显放在 sass 里比较科学,学习了。
性能上两种方式差别大吗?
#13 楼 @qinfanpeng 你说的对,确实如此,可能是其他地方的 each 报错吧。
@ds = @dsa.select { |k,j| k =~/#{params[:search]}/ }
这里加个空值保护啊,万一你的检索条件是一个值也没有检索出来的,@ds就是 nil 不能用 each 方法了。
哈哈。我也加个分母
其实 code school 很不错,就是视频不翻墙看不了,不知道国内有没有可以模仿得比较好的。
star 数量感人
下了班过去可能会有点迟到,不知道要不要紧。
#15 楼 @qinfanpeng 和上面的差不多 def 一个单件方法
def C.method end