六 07
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 [...]
(阅读更多精彩内容...)
五 02
2010年五月2日,星期日,下午 2:02 | 分类:
apple mac |
给我留言(5 条留言) |
拿到mac后最重要的就是先把Rails开发环境装好。apple介绍上写的是,mac mini装的是server版本,这样开发环境应该是已经装好的。可我的不是,没有Rails环境,只有ruby 1.8.7。这样也好,体验一下配制开发环境的过程。 1、gem 安装Rails 这个没有问题,默认已经安装了2.2.2,只要再装上需要的几个版本就可以 2、装xcode 问题来了,rake的时候出错,按照ubuntu的经验,估计是缺少编译环境,ubuntu上是装了ruby-dev。 装上xcode,问题解决。(本人绝对新人,欢迎朋友们指教,更多资料大家google吧) 3、装MacPort 这是一个奇怪的感觉,没有apt-get感觉不太习惯,所以装上MacPort,继续装ImageMagick,这个竟然用了一个多小时,具体安装方法参考:http://rmagick.rubyforge.org/install-osx.html 4、重点来了,mysql,apache,php环境 其实本想一个个装一下,但是看到了mamp,就试验一下,没想到很容易就搞定了。。 参考: http://www.mamp.info/en/downloads/index.html 可是,问题没结束,gem install mysql的时候出现了问题,因为mysql是俗话讲的集成,免安装过来的,不是默认配制,所以,需要重新编译一下mamp的mysql部分,才能正常gem安装mysql驱动。 重点在:gem install -v=2.7 mysql — –with-mysql-config=/Applications/MAMP/Library/bin/mysql_config 注意红色的部分,因为最新的2.8.1会提示“Virtual timer expired”。建议大家不要轻易升级gem,实在要升级,一定本地环境完全模拟一遍,包括各个gem版本,建议用rvm的朋友一定要多留意,rvm很好,一定要早入手熟悉。 具体参考:http://boonedocks.net/mike/archives/175-MAMP-and-the-Ruby-MySQL-Gem.html 进行到这里感觉很幸福,发现分享自己的经验原来可以帮人解决那么多问题,也节省时间。这也是我写这个笔记,分享经历的动力。 5、终于到textmate了 macx.cn的软件栏目里有下载,总算见到textmate的样子了,之前netbeans也只是模仿一点点样子而已。 更多的textmate使用见仁见智吧,不多说,目前很痴迷mac,好玩的东西都要用一下。 写到这,环境基本ok了,开始Rails的工作吧。
(阅读更多精彩内容...)
十二 07
2008年十二月7日,星期日,上午 2:02 | 分类:
RailsNote |
给我留言 |
这是个很简单的Rails2.1.2的 find 的应用,来自Rdoc ActiveRecord::Base 一、find :first 和find :all 使用 Model.find_by_user_name ,来简写 Model.find(:first, :conditions=>["user_name=?",user_name]) 使用 Model.find_all_by_user_name ,来简写 Model.find(:all, :conditions=>["user_name=?",user_name]) 这里也可以使用and,比如典型的用户名和密码查询:Person.find_by_user_name_and_password(user_name, password) find也支持带参数的查询,比如Payment.find_all_by_amount(50, :order => “created_on”) 二、find_or_create_by_和find_or_initialize_ find_or_create_by_:当查询的内容不存在时,创建并保存该记录 find_or_initialize_:更上面的相似,只是创建不保存该记录,需要自己再次save 这里也支持参数和代码块,如 User.find_or_create_by_name(‘Bob’, :age => 40) { |u| u.admin = true } 三、find_by_的时候,支持多属性,如 Tag.find_or_create_by_name(:name => “rails”, :creator => current_user) 以上文字来自Rails2.1.2的Rdoc文档ActiveRecord::Base
(阅读更多精彩内容...)
十一 17
2008年十一月17日,星期一,上午 7:07 | 分类:
RailsNote |
给我留言 |
class, module, def 标志着切换到新的 self, main 是默认的 self 对象用来引用自己的专门术语。self 作为消息默认的接受者,如果消息接受者是 self ,可以省略接受者和圆点。 如果存在同名的方法名和变量,而且你使用裸词标识符,那么变量具有优先权。要强制 Ruby 将标识符当作方法名,你必须使用 self.talk 或者用参数列表为空的 talk() 来调用方法。 有一个场合,即使是发送消息给当前的 self,也必须使用完整的“对象 圆点 消息”记法,那就是在调用写方法的时候。因为 Ruby 总之将序列“裸词=值”解释为对局部变量的赋值。为了调用当前对象的 venue= 方法,必须显示的给出 self。 private 和 protected 的区别 私有方法意味着该方法不能使用显式的接收者来调用。Ruby 认为你想要发送消息给当前对象 self。所以仅当 self 是一个可以响应消息的对象时,该消息才有对象接收。那啥时候 self 才会是类的实例呢?当执行类的任何一个实例方法时。所以看如下代码 class Baker def bake_cake @batter = [] pour_flour add_egg return Cake.new end def pour_flour @batter.push(Flour.new) end [...]
(阅读更多精彩内容...)
十一 16
2008年十一月16日,星期日,上午 9:09 | 分类:
RailsNote |
给我留言 |
模块没有实例,模块被混含在类中。这样类的实例可以调用定义在模块中的实例方法。混含操作由 include 语句实现。require 或 load 时,加载的内容放在引号里。但是使用 include 时,不使用引号。 module Stacklike attr_reader :stack def initialize @stack = Array.new end def add_to_stack(obj) @stack.push(obj) end def take_from_stack @stack.pop end end require “stacklike” class CargoHold include Stacklike def load_and_report(obj) pust obj.object_id add_to_stack(obj) end def unload take_from_stack end end 使用名称作为类名,使用形容词作为模块的名。上面的例子演示了如何进一步发挥模块的作用。 当给对象发送它不理解的消息的时候,会触发内建方法 method_missing 调用。 class Bicycle attr_reader :gears, :wheels, :seats def [...]
(阅读更多精彩内容...)
十一 16
2008年十一月16日,星期日,上午 5:05 | 分类:
RailsNote |
给我留言 |
实例变量使得单个对象可以记忆状态。实例变量的名字以@开头。实例变量仅仅对于它所属的对象来说是可见的。在一个特定类的某一方法中初始化的实例变量,与同一个类的其他方法定义中引用的同名实例变量是同一个。 class c def inst_var_init(value) puts “Setting an instance variable…” @ivar = value end def inst_var_report puts “Inspection the value of the instance variable…” puts @ivar end end 初始化对象状态 class c def initialize(venue, date) @venue = venue @date = date end def venue @venue end def date @date end end =号方法和语法糖衣,Ruby允许定义以等号结束的方法。另外当解释器看到一个裸词后面有等号的时候。它会自动忽略等号前面的空格。从而得到一条单独的消息,例如 price= 。 class Ticket [...]
(阅读更多精彩内容...)
十一 10
2008年十一月10日,星期一,上午 7:07 | 分类:
RailsNote |
给我留言 |
def all @order = params[:order] || “number” sort_proc = case @order when “author” then lambda {|r| [r.user.name.downcase, r.number]} when “status”, “title”, then lambda {|r| [r.send(@order).downcase, r.number]} when “number” then lambda {|r| -r.number} end @rcrs = Rcr.find(:all).sort_by &sort_proc end 下面是一个 respond_to? 和 send 方法的例子 request = gets.chomp if ticket.respond_to?(request) puts ticket.send(request) else puts “No such information [...]
(阅读更多精彩内容...)
十 27
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
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 [...]
(阅读更多精彩内容...)
十 24
2008年十月24日,星期五,下午 2:02 | 分类:
Advanced Rails,
default |
给我留言 |
解决了前几篇所有的疑惑后,理解method_missing就变得非常简单。其准则是:如果整个方法查找过程中,直到到达了Object都以失败而告终,那么将再次执行方法查找,但这次查找的是method_missing方法而不是原来调用的方法。如果method_missing方法被找到,它将被传入原方法的调用参数并调用,原调用的代码块也会被传入method_missing方法。 Object中的缺省method_missing(rb_method_missing)函数将抛出一个异常。
(阅读更多精彩内容...)