www.appflying.com,iPhone and iPad, top Apps, drop price.
‘Advanced Rails’ 分类下的文章
07

在CentOS5上部署Rails3应用

2011年六月7日,星期二,上午 12:12 | 分类:Advanced Rails, RailsNote | 给我留言 |

1、安装rvm 安装rvm前,要先安装git。因为rvm的安装教程就是一个git的小脚本。 >>wget http://kernel.org/pub/software/scm/git/git-1.7.5.3.tar.bz2 Oop!这里有个问题,我tar不常用,这里tar xvfz git-… 是会提出格式错误的,查了一下需要换一个命令:tar -xvjpf git-… 之后, make prefix=/usr/local all make prefix=/usr/local install 看到git 版本后,安装rvm git –version 剩下的,就是按照 https://rvm.beginrescueend.com/rvm/install/ 的讲解一步步安装吧,最后,阿?为什么 type rvm | head -1 会提示错误呢?我也被搞糊涂了,按照提示,我重新打开一个终端窗口,这下正常了。所以再看看文档吧。 接着,安装1.8.7 2、安装ruby 1.8.7和gem rvm install 1.8.7 注:我又将用户切换回了root,而在进行到Load RVM into your shell sessions as a function的时候,我不得不切换回user。 rvm use 1.8.7 显示正常了。 安装gems http://rubygems.org/pages/download 3、安装rails gem install rails -v [...]

(阅读更多精彩内容...)
29

redmine插件开发心得

2011年三月29日,星期二,下午 2:02 | 分类:Advanced Rails, iPhone | 给我留言 |

上上周经Q友介绍,接了一个redmine插件开发的小项目。我很感兴趣的是可以借此机会把redmine熟悉一下,所以没太考虑价钱就答应了下来。现在想想,这次开发学到的东西很多,也认识了专业的开发团队,很值得。下面把redmine插件开发的经验笔记一下。 先来截图: 地址:http://www.cocos2d-x.org/projects/cocos2d-x/apps 简单介绍下 cocos2d-x is a multi-platform, light weight & developer-friendly C++ 2D mobile game engine, open source and released under MIT License. It is a child branch of the famous “cocos2d-iphone” project, and will keep the primary features sync with it. 更多细节请访问 http://www.cocos2d-x.org/projects/cocos2d-x/wiki 好了,说下这个插件实现的功能。 一是管理发布平台,比如iOS,Android,WoPhone,Windows,Other,未来它还会有其他的平台。 二是在这些平台分类里,上传app,比如时下最火的iOS app,android app等。当上传iOS app时,可自动采集该信息。 一、让我们开始 插件如何开发呢?下载其他插件的代码来研究是关键的第一步。因为之前对redmine插件开发一无所知,所以下面的笔记有点啰唆。 先看一下官方发布的插件开发文档,http://www.redmine.org/projects/redmine/wiki/Plugin_Tutorial,请大概的了解一下。然后,我们去redmine插件列表,下载两个很有代表性的插件,redmine_polls和redmine_bookmarks,把它们放到 vendor/plugins 里。选择这两个插件的原因是它们都是自主上传,填写内容的。 [...]

(阅读更多精彩内容...)
06

paperclip上传后的原图大小

2011年一月6日,星期四,下午 1:01 | 分类:Advanced Rails | 给我留言 |

一时想不起来如何拼写了,写在这里作为笔记。 has_attached_file :icon, :styles => { :original => “74×74″ }, # 将paperclip上传原图做大小限制 :url => “/:class/:attachment/:id/:style_:basename.:extension”, :path => “:rails_root/public/:class/:attachment/:id/:style_:basename.:extension”, :default_url => “/images/sample_icon.png”

(阅读更多精彩内容...)
十一 09

有了ultraviolet,可是没有uv,怎么办?

2010年十一月9日,星期二,下午 9:09 | 分类:Advanced Rails | 给我留言 |

问题: gem ‘ultraviolet’, ’0.10.2′ bundle install 代码highlight的时候,require ‘uv’ 失败。 提示:uninitialized constant PadsHelper::Uv 解决办法:gemfile中,改为 gem ‘ultraviolet’, ’0.10.2′, :require => “uv” 搞定。 最近在弄一个小项目,为程序员们提供一个简单舒适的代码经验管理工具。demo出来后希望大家支持。

(阅读更多精彩内容...)
25

Rails如何不加载某插件?

2010年六月25日,星期五,下午 2:02 | 分类:Advanced Rails | 给我留言 |

在用paperclip的时候,碰到一个问题: 在windows上用的插件和linux或mac上的不同,但是两个又在同一个版本库里,同步到别的环境时,要区别调用,所以,需要针对linux做一个设置。因为插件很多,不可能一一指定,所以google到了这个。。(PS:书上或许有,可是总不用也不记得了) config.plugins = [ :all ] config.plugins -= [ "paperclip-win" ] ok,继续写代码去!

(阅读更多精彩内容...)
十一 27

1.3.3 Continuations

2008年十一月27日,星期四,下午 12:12 | 分类:Advanced Rails | 给我留言 |

Continuations 是一种非常强大的控制流机制。一个 Continuation 代表了调用栈和词法变量的特定状态。它是 Ruby 代码执行过程中特定点的一个快照。不幸的是,在 Ruby1.8 的实现中 Continuations 是如此的慢以至于对于许多的应用来说根本无法使用。在即将到来的 Ruby1.9 虚拟机中情况可能会有所改善,但最好不要期望在使用了 Ruby1.8 的 Continuation 的情况下能够获得好的性能。尽管如此,Continuations 仍然是非常有用的概念,基于 Continuations 的 web 框架提供了 Rails 的一些有趣的选择,因此在这里我们会对它们做一下考察。 Continuations之所以非常强大有下面几个原因: Continuations其实就是一些对象;它们可以被传递在函数之间。 可以从任何位置调用Continuations。只要持有对Continuation的引用,就可以对其进行调用。 Continuations是可重入的。可以使用Continuations从一个函数多次返回。 Continuations常常被描述为“结构化的GOTO“。因此,它们应该像任何类型的GOTO概念一样被谨慎的对待。在应用代码中不应该出现或者应该极少出现Continuations;它们通常应该被封装在库文件中。我不这么说是因为我认为开发人员应该被与它们隔离开来。 Continuations是如此普遍的一个概念,以至于通常来说在其之上建立抽象比直接使用它更合理。程序员在构建应用软件的时候应考虑使用”外部迭代(external iterator)“或者”协同程序(coroutine)“(两个都是在Continuations之上的抽象)而不是”continuation“。 SeaSide是一个基于Continuations的Smalltalk Web应用框架。Continuations 在SeaSide 中用于管理会话状态。每个用户的会话都对应一个服务器端的Continuation。当一个请求到达的时候Continuation将被调用而且更多的代码被执行。其结果是整个的事务能够被编写为单独的一段代码流,即使它们跨越了多个HTTP请求。这种能力是由于Smalltalk的Continuation能够被序列化;它们可以被写到一个数据库或者文件系统,然后被取出和反序列化,并在请求中重新调用。Ruby的Continuation不能被序列化。在Ruby中,Continuation只能被装载到内存中而不能被转换为一个字节流。 Borges(http://borges.rubyforge.org/)是直接移植到Ruby的Seaside 2实现。SeaSide与Borges的最根本的区别就是Borges必须将所有当前的Continuations保存在内存中,因为它们不能被序列化。这个巨大的限制很不幸地阻止了Borges在任何规模的Web应用中被成功使用。只要Continuation在任何一种Ruby实现中被支持,这个限制就可以被克服了。 Continuation的能力可以通过下面的Borges示例代码来见证,它用于渲染在线商店的一系列条目: class SushiNet::StoreItemList < Borges::Component def choose(item) call SushiNet::StoreItemView.new(item) end def initialize(items) @batcher = Borges::BatchedList.new items, 8 end def [...]

(阅读更多精彩内容...)
27

1.3.2 生成式编程:在运行中编写代码

2008年十月27日,星期一,上午 8:08 | 分类:Advanced Rails, default | 给我留言 |

生成式编程(Generative Programming)——即用代码来编写代码,是一个包含了若干种技术的一种强大的技术。这种技术可以以最简单的方式实现,例如编写一段用于自动完成编程中一些单调乏味的操作的shell脚本。举个例子,假设你想为每个用户生成一个示例项目的测试fixture: brad_project: id: 1 owner_id: 1 billing_status_id: 12 john_project: id: 2 owner_id: 2 billing_status_id: 4 … 如果这种语言不支持可脚本化(可编程)的测试fixture,你恐怕不得不手工编写了。当数据持续增加时这将会变得混乱,而且当这些测试fixture和源数据层有着奇怪的依赖关系的时候手工编写几乎变得不可能。 朴素的生成式编程能够让你编写脚本来从源数据生成这些测试fixture。虽然还不够理想,但是比起全部手工编写已经算是个巨大的进步了。但其维护仍然让人头痛,因为你不得不将那个脚本放在编译过程中,而且需要保证源数据发生了变化时测试fixture被重新生成了。 令人欣慰的是在Ruby或Rails中,这种烦恼几乎是不需要的。几乎每个方面的Rails应用的配置都是可脚本化的,这主要归因于使用了内部的特定领域语言(DSL)。在一个内部的DSL中,你能够支配使用Ruby语言的所有特性,而不仅仅是库文件作者决定要提供给你的那些特定接口。 再返回去看前面的例子,ERb将这个过程变得异常简单。我们可以通过使用ERb的<% %>和<%= %>标签在上面用到的YAML文件中插入任意的Ruby代码,包括我们需要的任何逻辑: < % User.find_all_by_active(true).each_with_index do |user, i| %> < %= user.login %>_project: id: < %= i %> owner_id: < %= user.id %> billing_status_id: < %= user.billing_status.id %> < % end %> ActiveReacord中对这个功能的实现几乎不能再简单了: yaml [...]

(阅读更多精彩内容...)
27

1.3.1 运行时方法延迟查找

2008年十月27日,星期一,上午 8:08 | 分类:Advanced Rails, default | 给我留言 |

我们常常想创建一个能够随着运行时的数据变换其方法的接口。Rails中这方面最突出的一个例子就是ActiveRecord的属性存取方法。ActiveRecord对象的方法调用(例如person.name)在运行时将被转换成属性存取。在类方法级别,ActiveRecord提供了极大的灵活性:Person.find_all_by_user_id_and_active(42,true)被转换成相应的SQL查询,如果被查询的属性不存在那么就会抛出一个标准的NoMethodError错误。 其背后的秘密是Ruby的method_missing方法。当对象上的一个不存在的方法被调用的时候,Ruby在抛出NoMethodError前首先检查此对象的类是否存在method_missing方法。method_missing的的第一个参数是被调用方法的名称;剩下的那些参数对应那些传递到被调用方法的参数。任何传递到方法的块也会被传递到method_missing方法。因此,一个完整方法的轮廓如下: def method_missing(method_id, *args, &block) … end 使用method_missing有下面的几个缺点: 在方法查找时它要比普通的方法慢。简单的测试表明用method_missing来调用方法的时间要比用常规方式进行调用多耗费两到三倍的时间。 因为被调用的那些方法根本不实际存在,所以他们只有在方法查找整个过程的最后一步才能被截取到,也就是说它们不会像常规的方法那样被生成文档或者内省。 因为所有的动态方法都必须通过method_missing方法,所以当一个方法含有各种各样代码,而这些代码又需要动态添加方法时其方法体将变得异常庞大。 使用method_missing将限制其与API后续版本的兼容性。一旦依赖method_missing生成的那些未定义的方法来完成特定的操作后,在API的后续版本中引入的那些新方法也许会使你的用户失望。 ActiveRecord中提供的generate_read_methods 特性是一个弥补这些缺失很好的替代方案。ActiveRecord 不是等待method_missing来截取方法调用而是自己实现了属性的设置和读取方法,这样它们就可以通过常规方法的分派来被调用了。 总的来说这是个强大的方法,Ruby的动态本性使得那些方法在其被第一次调用时,用其更优化的版本来替代其本身成为可能。它也被用于要求迅速响应的Rails路由;我们将在本章的后续部分看到它的影子。

(阅读更多精彩内容...)
27

闭包

2008年十月27日,星期一,上午 8:08 | 分类:Advanced Rails, default | 给我留言 |

在代码块或者过程访问定义在其作用范围以外的变量时,就会创建闭包(Closures)。即使包含原始变量的代码块已经超出作用范围了,但那些被其它块和过程引用的变量也会被一直被保留着,直到引用它们的块和过程全部超出作用范围。下面的这个极度简化的例子,虽然确实是没有什么实际的用途,但能够很好的解释上面的情景: def get_closure data = [1, 2, 3] lambda { data } end block = get_closure block.call # => [1, 2, 3] 从get_closure中的匿名方法(即lambda)返回的是定义在其作用范围外的局部变量data。只要块变量一直在作用范围内,它将保存其对data的引用,而且这个data的实例也不会被消除(即使get_closure方法已经返回)。需要注意的是每次get_closure被调用时,data将指向不同的变量(因为它是方法局部变量): block = get_closure block2 = get_closure block.call.object_id # => 76200 block2.call.object_id # => 76170 闭包的一个典型的例子就是make_closure方法,它返回一个累加方法,当被执行时进行累加并返回累加的当前值。在Ruby中,make_counter 实现代码如下: def make_counter(i=0) lambda { i += 1 } end x = make_counter x.call # => 1 [...]

(阅读更多精彩内容...)
27

代码块转换为过程和过程转换为代码块

2008年十月27日,星期一,上午 8:08 | 分类:Advanced Rails, default | 给我留言 |

当前的Ruby实现有一点不足:Blocks代码块不总是Procs过程,Procs过程也不总是Blocks代码块。普通的代码块(定义在do…end 或者{}中)必须依附在一个方法调用上,而不能自动成为对象。例如,你不能把代码写成code_block = {puts “abc”}。这就是Kernel#lambda 和Proce.new 的用途:将代码块转换为过程。 block_1 = lambda { puts “abc” } # => #<Proc:0×00024914@-:20> block_2 = Proc.new { puts “abc” } # => #<Proc:0x000246a8@-:21> Kernal#lambda与Proc.new之间仅存在着些许区别。由Kernel#lambda 创建的Proc被调用时返回给调用方法的值是在Proc中给定的值;而由Proc.new 创建的Proc被调用的时候,Proc将试图从当前的函数方法中返回,但是,如果不能从方法调用中返回那么它就抛出LocalJumpError错误。下面是一个具体的例子: def block_test lambda_proc = lambda { return 3 } proc_new_proc = Proc.new { return 4 } lambda_proc.call # => 3 proc_new_proc.call # => puts “Never [...]

(阅读更多精彩内容...)
  • 信息发布
macbook pro



关于 里克
里克:本名李玮,全职SOHO开发,技术咨询
邮件:hi@liwei.me
QQ:5175486
MSN:liwei78@live.com
05年开办公司,从事企业网站开发及维护,后从事社会化搜索引擎研发,08年底至今从事sns开发。近期专注Rails3,工作笔记整理及iphone开发学习。

狂爱Fm系列游戏。喜欢研究电影。关注IT新闻。写原创剧本和使用the movies拍摄短片,剪辑能力极强。美剧迷。狂热的英超曼城球迷。32岁的东北人。