- 浏览: 2678422 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
80后的童年2:
深入浅出MongoDB应用实战开发网盘地址:https://p ...
MongoDB入门教程 -
shliujing:
楼主在不是精通java和php的前提下,请不要妄下结论。
PHP、CakePHP哪凉快哪呆着去 -
安静听歌:
希望可以一给一点点注释
MySQL存储过程之代码块、条件控制、迭代 -
qq287767957:
PHP是全宇宙最强的语言!
PHP、CakePHP哪凉快哪呆着去 -
rryymmoK:
深入浅出MongoDB应用实战开发百度网盘下载:链接:http ...
MongoDB入门教程
Ruby里方法的查找顺序是本类=>本类include的模块=>父类=>父类include的模块...
而当最终还是没有找到该方法时,会触发内建的method_missing方法的执行
默认的method_missing会触发异常,而我们可以通过override method_missing方法来提供一些特性
比如Rails的ActiveRecord,User.find_by_name()这个方法本来没有在User类里定义,但是可以通过override method_missing来匹配数据库fields
然后使用class_eval和send动态创建和调用查询方法
我们来看看C:\ruby\lib\ruby\gems\1.8\gems\activerecord-1.15.3\lib\active_record\base.rb中的一段代码就清除了:
把private去掉
而当最终还是没有找到该方法时,会触发内建的method_missing方法的执行
默认的method_missing会触发异常,而我们可以通过override method_missing方法来提供一些特性
比如Rails的ActiveRecord,User.find_by_name()这个方法本来没有在User类里定义,但是可以通过override method_missing来匹配数据库fields
然后使用class_eval和send动态创建和调用查询方法
我们来看看C:\ruby\lib\ruby\gems\1.8\gems\activerecord-1.15.3\lib\active_record\base.rb中的一段代码就清除了:
# Enables dynamic finders like find_by_user_name(user_name) and find_by_user_name_and_password(user_name, password) that are turned into # find(:first, :conditions => ["user_name = ?", user_name]) and find(:first, :conditions => ["user_name = ? AND password = ?", user_name, password]) # respectively. Also works for find(:all), but using find_all_by_amount(50) that are turned into find(:all, :conditions => ["amount = ?", 50]). # # It's even possible to use all the additional parameters to find. For example, the full interface for find_all_by_amount # is actually find_all_by_amount(amount, options). def method_missing(method_id, *arguments) if match = /^find_(all_by|by)_([_a-zA-Z]\w*)$/.match(method_id.to_s) finder, deprecated_finder = determine_finder(match), determine_deprecated_finder(match) attribute_names = extract_attribute_names_from_match(match) super unless all_attributes_exists?(attribute_names) attributes = construct_attributes_from_arguments(attribute_names, arguments) case extra_options = arguments[attribute_names.size] when nil options = { :conditions => attributes } set_readonly_option!(options) ActiveSupport::Deprecation.silence { send(finder, options) } when Hash finder_options = extra_options.merge(:conditions => attributes) validate_find_options(finder_options) set_readonly_option!(finder_options) if extra_options[:conditions] with_scope(:find => { :conditions => extra_options[:conditions] }) do ActiveSupport::Deprecation.silence { send(finder, finder_options) } end else ActiveSupport::Deprecation.silence { send(finder, finder_options) } end else ActiveSupport::Deprecation.silence do send(deprecated_finder, sanitize_sql(attributes), *arguments[attribute_names.length..-1]) end end elsif match = /^find_or_(initialize|create)_by_([_a-zA-Z]\w*)$/.match(method_id.to_s) instantiator = determine_instantiator(match) attribute_names = extract_attribute_names_from_match(match) super unless all_attributes_exists?(attribute_names) attributes = construct_attributes_from_arguments(attribute_names, arguments) options = { :conditions => attributes } set_readonly_option!(options) find_initial(options) || send(instantiator, attributes) else super end end
评论
2 楼
boobmoom
2009-09-27
danny.chiu 写道
hideto大哥附个实例就好了,方便我们菜鸟了。
输入http://localhost:3000/show_ips/wibble没工作,日志也没打印出来,依然是UnknownAction..
class ShowIpsController < ApplicationController def index @all_ips = ShowIp.find(:all) @your_ip = request.remote_ip unless ShowIp.find_by_ip(@your_ip) ShowIp.create(:ip => @your_ip) end respond_to do |format| format.html # index.html.erb format.xml { render :xml => @show_ips } end end private def method_missing logger.debug { "=-=-=-=-=-=-=-=-=-=-" } end end
输入http://localhost:3000/show_ips/wibble没工作,日志也没打印出来,依然是UnknownAction..
把private去掉
1 楼
danny.chiu
2009-06-14
hideto大哥附个实例就好了,方便我们菜鸟了。
输入http://localhost:3000/show_ips/wibble没工作,日志也没打印出来,依然是UnknownAction..
class ShowIpsController < ApplicationController def index @all_ips = ShowIp.find(:all) @your_ip = request.remote_ip unless ShowIp.find_by_ip(@your_ip) ShowIp.create(:ip => @your_ip) end respond_to do |format| format.html # index.html.erb format.xml { render :xml => @show_ips } end end private def method_missing logger.debug { "=-=-=-=-=-=-=-=-=-=-" } end end
输入http://localhost:3000/show_ips/wibble没工作,日志也没打印出来,依然是UnknownAction..
发表评论
-
用了TextMate才知道什么叫神级Editor
2011-03-09 04:51 57961一直用Eclipse作为开发Ruby和Java项目的IDE,但 ... -
Ruby使用OAuth登录新浪微博和豆瓣
2011-01-09 12:49 4434首先需要安装oauth这个gem包 gem install ... -
使用Passenger+nginx部署Rails
2010-12-28 15:12 50111. Install Passender gem instal ... -
markItUp+rdiscount搭建Rails下可视化Markdown编辑器
2010-12-21 17:48 5447markItUp是基于jQuery的可视化编辑器,支持Html ... -
Rails3 and MongoDB Quick Guide
2010-12-10 14:13 2753Install MongoDB Download: http: ... -
基于ruby-protobuf的rpc示例
2009-08-11 11:51 41481, 安装ruby-protobuf gem instal ... -
Ruby导出xls和csv的utf-8问题的解决
2009-02-04 15:05 6839数据库数据为utf-8格式,包括中文和拉丁文等等 导出文件xl ... -
URL/HTML/JavaScript的encode/escape
2009-01-04 13:03 9324最近经常被URL、HTML、JavaScript的encode ... -
各种排序的Ruby实现
2008-11-27 14:51 3994Θ(n^2) 1, Bubble sort def bu ... -
12月5日北京RoR活动!
2008-11-26 18:38 3017又是一年过去了,Rails在国内的发展势态良好,很多使用RoR ... -
Rails程序开发的最大问题是代码规范
2008-08-28 11:56 5518使用Rails开发大型复杂B2B应用一年了,这个项目目前开发人 ... -
Web开发大全:ROR版——推荐序
2008-07-09 00:39 2416来自http://www.beyondrails.com/bl ... -
深入ActionMailer,使用Sendmail发邮件
2008-07-03 11:41 3396来自: http://www.beyondrails.com/ ... -
Rails里如何结合ExceptionNotification配置gmail账户发邮件
2008-06-19 19:56 30821,安装ExceptionNotification rub ... -
使用coderay和railscasts样式进行代码高亮
2008-06-17 00:16 2395CodeRay是一个语法高亮的Ruby库,效率很不错。 Cod ... -
Capistrano试用
2008-06-16 19:05 19581,客户端机器安装Capistrano gem insta ... -
lighttpd真垃圾啊
2008-06-04 18:38 2533使用lighttpd+fcgi跑Rails程序,文件上传会si ... -
将gem变成plugin
2008-06-04 11:27 1801有什么样的需求就有什么样的对策 当vhost上的帐号没有ge ... -
在Rails里使用ReCaptcha添加验证码
2008-06-03 15:51 42661,去http://recaptcha.net/sign up ... -
Rails里给文件上传添加progress_bar
2008-05-27 17:00 2087文件上传很慢时,UI没有什么用户提示,这样让人很费解,所以我们 ...
相关推荐
`method_missing`是Ruby中的一个特殊方法,它在试图调用一个未定义的方法时被触发。这为开发者提供了一个机会,可以在运行时定义或处理这些方法的调用。这种机制非常适合于创建动态方法,即那些在编译时不存在但在...
没有method_missing调用 带:collection选项的render_partial实际上会渲染集合(与Jbuilder不同) 句法 .jb模板应包含Ruby代码,该代码将返回任何to_json (通常为Hash或Array)的Ruby对象。 然后,返回值将to_json...
蛋白石路轨 Rails绑定。 ()寻找Webpack支持? :eyes: 如果要通过Webpack... method_missing = trueRails . application . config . opal . optimized_operators = trueRails . application . config . opal . arity_
6. **元编程**:Ruby的元编程特性,如`class_eval`、`instance_eval`、`method_missing`等,以及如何利用它们来增强代码的动态性。 7. **测试驱动开发(TDD)**:Ruby社区非常注重TDD,因此可能包含关于Rspec或Test::...
在Ruby on Rails中,理解Ruby的基本语法、类和对象、模块、块、 Proc和Lambda、以及元编程特性(如`send`和`method_missing`)是至关重要的。 2. **ActiveRecord**:作为Rails的ORM(对象关系映射)组件,...
使用send , define_method和method_missing遍历不同的元编程技术 将您的思维扩展到元编程,并让您考虑可以在自己的代码中利用它的地方 设置 要求 该讲习班是使用Ruby 1.9.3创建的,但是在2.1.2版本中有效。 假设您...
7. **闭包和元编程**:Ruby的闭包(Proc和Lambda)以及动态特性(如eval、instance_variable_get/set、method_missing等)让元编程变得非常强大,允许在运行时修改和扩展代码。 8. **正则表达式**:Ruby的Regexp类...
此外,Ruby的`send`方法可以动态调用方法,`method_missing`可以捕获未定义的方法调用。 Ruby的Gem库是其生态系统的一大亮点,提供大量的第三方库和框架,如Rails(一个流行的Web开发框架)、Sinatra(轻量级Web...
覆盖method_missing方法,并使用它来拦截对不存在的方法的调用。 每个不存在的方法都应成为标准的HTML标记: 例子 require 'xhtml_builder' b = XHTMLBuilder.new b.html do b.head do b.title("My Fancy Webpage") ...
def self.method_missing(name, *args) puts "Called method: #{name}" end my_object = MyClass.new my_object.some_method # 输出: "Called method: some_method" ``` ##### 2. eval `eval`函数可以用来执行一...
2. 方法拦截:Ruby提供了method_missing方法,它允许我们拦截对当前对象中未定义方法的调用,并进行自定义处理。 3. 模块混入:Ruby中的模块可以被包含(include)到类中,这在本质上是把模块中的方法和类混合,...
- **BasicObject类**:为创建代理类提供了更简洁的基类,减少了method_missing的使用。 然而,尽管Ruby 1.9提供了诸多改进,但它仍处于开发阶段,不适用于生产环境。Rails核心团队和其他gem及插件开发者正在努力...
- **元编程**:Ruby 提供了一系列方法来实现元编程,例如 `eval`、`send`、`method_missing` 等。 - **多线程**:虽然 Ruby 本身不支持原生多线程,但它提供了线程(Thread)模型来模拟并发执行。 - **性能优化**:...
此外,书中还会介绍Ruby的元编程能力,如`send`方法和`method_missing`,这使得Ruby在运行时可以修改自身的行为。 在“专业开发者”的部分,作者会讲解如何使用Ruby的标准库和第三方gem(Ruby的库包管理器),例如...
`class 用于自定义类的方法,`method_missing`可以捕捉未定义的方法调用。 10. **Gem包管理**:Ruby的生态系统中,Gem是包管理工具,用于分发、安装和管理Ruby库。通过Gem,开发者可以方便地使用和分享代码。 11. ...
9. **Rails框架**:Ruby on Rails是Ruby最著名的Web开发框架,它采用MVC(Model-View-Controller)架构模式,提供了一套约定优于配置的开发规则,极大地提高了开发效率。 10. **元编程**:Ruby的元编程能力非常强大...
3. 控制结构:Ruby提供了if/else、unless、case、while、until、for等控制结构,用于实现条件判断和循环。例如,`if x > 0 then puts "Positive"`。 4. 函数与方法:Ruby中函数被称为方法,可以定义在类或模块中,...
5. **元编程**:Ruby提供了`class`, `module`, `define_method`, `method_missing`等工具,允许在运行时创建和修改类和模块,实现自省和自定义行为。 6. **Gem生态系统**:Ruby拥有庞大的Gem库,这是一个开源软件包...
`class 用于自定义类的元类,`method_missing`方法可以捕捉未定义的方法调用,从而实现动态行为。 九、Gem和Ruby生态系统 Ruby的Gem是其强大的包管理系统,开发者可以通过Gem获取和安装各种库和工具。Ruby的生态...
- `define_method`和`method_missing`:前者用于在运行时定义方法,后者是当尝试调用一个不存在的方法时的回调,常用于实现自定义错误处理或动态行为。 4. **模块(Module)**: - 模块用于封装相关的方法和常量...