ActiveSupport::Concern 和 gem 'name_of_person'(300✨) 的内部运行机制分析
理解ActiveRecord::Concern:
参考:include和extend的区别:
https://www.cnblogs.com/chentianwei/p/9408963.html
传统的模块看起来像:
module Mdef self.included(base) # base(一个类)扩展了一个模块"ClassMethods", base的类方法就包含了"ClassMethods"模块中的方法。base.extend ClassMethods # base添加了一个:disabled方法。base.class_eval doscope :disabled, -> { where(disabled: true) }endendmodule ClassMethods...end end
使用ActiveSupport::Concern:
require 'active_support/concern'module M# M扩展了模块Concern,可以使用Concern的方法。 extend ActiveSupport::Concern# 当M被一个类包括后,这个类就可以使用块内的方法了。 included doscope :disabled, -> { where(disabled: true) }end# 当M被一个类包括后,这个类的类方法就扩展了,?的方法就作为类方法使用。 class_methods do...end end
gem 'name_of_person'
一个小的gem,为英文网站用户的注册名字添加了很多调用的方法。
https://github.com/basecamp/name_of_person/tree/master/lib/name_of_person
- 加载了gem后,
- ActiveRecord::Base包含了模块HasPersonName, 就可以使用lib/name_of_person/has_person_name.rb中的方法:类方法has_person_name.
- 在Rails app中, app/model/user.rb, 使用has_person_name方法后,就include包含了模块Assignable。 User的实例就新增了2个实例方法,这两个方法会调用模块PersonName中的方法
- @user.name=: 调用PersonName.full(name)方法,@user的first_name, last_name属性被分配值。
- @user.name: 返回一个PersonName.new对象,这个对象可以使用:
- full | initials | familiar 等定义在模块PersonName中的方法。
- first | last
使用方法:
1 . User类必须包括first_name, last_name2个属性,添加validates :first_name, :last_name, presence: true
2. 当实例化一个@user时,代码内部调用name= 方法为first_name, last_name属性分配值!
(这里不是很理解,是否是devise这个gem,当发现必须验证first_name, last_name后,自动调用name=方法?)
3. 之后通过@user.name.xxx就可以使用不同的名和姓的组合。
分析:先看三张图:
图2
图3:
@user.name的内部运行机制:
首先是一个判断:
if @user.first_nameNameOfPerson::PersonName.new(@user.first_name, @user.last_name) end
如果first_name存在,则新增一个PersonName对象,调用initialize方法
def initialize(first, last = nil)raise ArgumentError, "First name is required" unless first.present?@first, @last = first, lastsuper fullend
然后调用full这个方法,进行if判断
def full@full ||= last.present? ? "#{first} #{last}" : firstend分析: 如果@user.last_name存在(last.present?),则 把@user的两个name属性合并,并分配给@full对象。
最后返回一个PersonName对象实例, 内部包括@first, @full, 及@last(根据@user决定是否存在)
@user.name = "Dav Tom"内部运行分析:
def name=(name)full_name = NameOfPerson::PersonName.full(name)self.first_name, self.last_name = full_name.try(:first), full_name.try(:last)end
首先:调用模块PersonName的类方法full。
- 把传入的字符串参数分成first, last变量
- 如果first变量存在,则新建一个PersonName对象
- 之后的分析和@ueser.name相同。
def self.full(full_name)first, last = full_name.to_s.strip.split(/\s+/, 2)new(first, last) if first.present?end
转载于:https://www.cnblogs.com/chentianwei/p/9829164.html
ActiveSupport::Concern 和 gem 'name_of_person'(300✨) 的内部运行机制分析相关推荐
- 浅谈SQL Server内部运行机制
原文:浅谈SQL Server内部运行机制 对于已经很熟悉T-SQL的读者,或者对于较专业的DBA来说,逻辑的增删改查,或者较复杂的SQL语句,都是非常简单的,不存在任何挑战,不值得一提,那么,SQL ...
- Vue.js 内部运行机制之总结 常见问题解答
Vue.js 内部运行机制之总结 & 常见问题解答 总结 在本小册的第一节中,笔者对 Vue.js 内部运行机制做了一个全局的概览,当时通过下面这张图把 Vue.js 拆分成一个一个小模块来介 ...
- VC++的学习(基于VS2008)——windows程序内部运行机制
昨天和今天都在学习windows程序的内部运行机制,再次学习这一章,我明显感到条理清晰了,原来这一章是讲我们所用的电脑,这样一个windows平台下程序运行的内部机制的.windows应用程序下最重要 ...
- 分析内部运行机制,教你解决Redis性能问题
摘要:聚焦Redis的性能分析,思考Redis 可以通过哪些机制来提高性能,当性能瓶颈发生的时候,我们又能做出哪些优化策略,最终确保业务系统的稳定运行. 本文分享自华为云社区<分析内部运行机制, ...
- Ray --内部运行机制、对象存储中对象的存储和容错
本篇主要介绍了分布式框架 Ray 的内部运行机制,对象的存储过程和容错能力.内部运行机制主要分为Ray的连接,远程函数的定义和使用以及获取对象ID的运行机制.对象存储主要是对象放入的序列化和从对象调出 ...
- 从template到DOM(Vue.js源码角度看内部运行机制)
写在前面 这篇文章算是对最近写的一系列Vue.js源码的文章(github.com/answershuto-)的总结吧,在阅读源码的过程中也确实受益匪浅,希望自己的这些产出也会对同样想要学习Vue.j ...
- [转] webpack之plugin内部运行机制
简介 webpack作为当前最为流行的模块打包工具,几乎所有的主流前端开发框架(React.Vue等)都会将其作为默认的模块加载和打包工具.通过简单的配置项,使用各种相关的loader和plugin, ...
- IIS 内部运行机制
ASP.NET是一个非常强大的构建Web应用的平台,它提供了极大的灵活性和能力以致于可以用它来构建所有类型的Web应用. 绝大多数的人只熟悉高层的框架如: WebForms 和 WebServices ...
- 《VC++深入详解》学习笔记 第一章 Windows程序内部运行机制
(金光鳞闪影若茫) 窗口四步走: 设计窗口类 注册窗口类 创建窗口 显示更新窗口 最后创建消息循环和响应函数 设计窗口类: typedef struct {UINT style;//窗口类型 WNDP ...
最新文章
- 《Science》杂志:机器学习究竟将如何影响人类未来的工作?
- DTH11驱动实例稳定修改补充
- FPP(彩包)、COEM(简包)、MOLP(license授) 介绍
- 程会玩 | 在.NET Core里操作Git
- Django中的class Meta知识点
- java map 赋值_java Listmap赋值的问题
- bootstrap3 徽章_尔冬升送张大大金像奖女神徽章,全国仅14枚,网友吐槽:他不值得...
- NBA Top Shot巨鲸17.5万美元购买的球星卡目前已值2000万美元
- 无法装载这个对象_面试官:别的我不管,这个JVM虚拟机内存模型你必须知道
- 【Mac】Mac键盘实现Home, End, Page UP, Page DOWN
- linux fortran 内存不足,[转载]linux 安装fortran 90 --zz
- 华为U2000网管研究实录 (4) - 运行分析(系统监控客户端)
- win11右键新建没有txt文本文档记事本怎么办
- matlab排序函数 下标,Matlab自带排序函数sort用法
- webView 修改背景颜色
- 腾讯云API弹性公网IP踩坑
- Kernel Pwn 入门 (2)
- 人工智能在医学影像中的研究与应用
- OpenCV在图片上画线和矩形
- ps ctrl+shift+j 切割瓶子
热门文章
- ceph存储原理_热门的分布式存储系统ceph入门介绍
- clistctrl控件最后插入在后面_老板让我把图片放到Excel表格中,批量插入效率高...
- html5中音频的标签,html5中的音频标签安全
- rust tpa_Rust(腐蚀)怎么tp求大神指教。请写在下面
- android移动应用基础教程源代码,Android移动应用基础教程 【程序活动单元Activity】...
- 单调栈 leetcode整理(二)
- vim中的jk为什么是上下_JK的完整形式是什么?
- FreeRTOS任务基础知识
- python---异常处理结构
- uva 1218——Perfect Service