rails部分学习笔记_Ruby_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > Ruby > rails部分学习笔记

rails部分学习笔记

 2010/12/5 13:14:08  shatler  http://shatler.javaeye.com  我要评论(0)
  • 摘要:其实已经在机子上有很久了,今天突然翻到有点有用的东西,笔记很重要呀。很乱,当时是简单地放在txt中的,在网络上放一份,已备不测。作程序的要学会幽默调用下列方法会返回一个列表其中包含当前目录中所有的文件:@files=Dir.glob('*')在.rb文件类文件中{validates_presence_of不为空validates_uniqueness_of唯一validates_numericality_of价格的合法性图片格式过滤validates_format_of:image_url,
  • 标签:笔记 学习 rails 学习笔记

其实已经在机子上有很久了,今天突然翻到有点有用的东西,笔记很重要呀。很乱,当时是简单地放在txt中的,在网络上放一份,已备不测。

?

作程序的要学会幽默

?

调用下列方法会返回一个列表其中包含当前目录中所有的文件:

@files = Dir.glob('*')

?

在.rb文件类文件中{

validates_presence_of ? 不为空

validates_uniqueness_of ? 唯一

validates_numericality_of ? 价格的合法性

?

图片格式过滤

??validates_format_of :image_url,

?? ? ? ? ? ? ? ? ? ? ?:with ? ? =>%r{\.(gif|jpg|png)$}i,

?? ? ? ? ? ? ? ? ? ? ?:message ?=>"must be a URL for a gif,jpg,or png image."

?

??protected

自定义方法价格验证

??def validate

?? ?errors.add( :price,"should be at least 0.01") if price.nil? || price < 0.01

??end

}

?

{未解决错误

?? 运用了Ajax,在add_to_cart.rjs中,

??当购物车中没有所要的产品时,添加时会出现rjs提示错误,亮起效果不能产生。

?

暂时解决方法

?? 修改add_to_cart.rjs文件

?? 其中有

if @current_item!=nil

??page[:current_item].visual_effect :highlight,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?:startcolor => "#88ff88",

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?:endcolor => "#114411"

else

??page.redirect_to :action => "index"

end

?? 当不存在产品时,执行controller中add_to_cart后,跳转回主页;当存在时,启用ajax并有亮起的

效果。

?

解决方法(网上找的):

page.select("tr#current_item").each { |tr| tr.visual_effect :highlight,

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?:startcolor => "#88ff88",

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?:endcolor => "#114411" }

经测试有效。

?

}

?

{

局部模板:

render方法会循环渲染局部模板。

局部模板的名字是“cart_item”,所以在局部模板内部就会有一个名叫cart_item的变量。

?

}

?

{render用法(已知):

render(:partial => "cart", :object => @cart)

render(:partial =>"cart_item",:collection => cart.items )

}

?

h() 方法用于对货品名称和描述中的HTM L 标记进行转义处理, 所以我们会看到锚

述信息中出现HTML标记因为它们被转义然后显示出来,而不是被解释为

HTML.

?

{

在加入每个controller时,检查文件config/routes.rb是否有相应的注册

如:map.resources :store

}

?

{

在html中格式化价格

1,sprintf("$%0.02f",product.price)

2,number_to_currency(product.price)

}

?

{

rake db:sessions:create时

可能会出现错误:

?Mysql::Error: Data too long for column 'session_id'...

}

清空浏览器cookis,解决问题。

?

?

{当有错误“undefined method `product' for #<...>”时,清空浏览器cookis}

?

?

{config/routes.rb

?map.connect 'products/:id', :controller => 'catalog', :action => 'view'

当添加这行语句时,products控制器下的任何action都会自动转到catalog控制器下的:action => 'view',

没有:action参数时,默认转到catalog下的:action=>'index'

?

代码出现过:

"/store"正常,"/store/index" 会有错误,

可能是由于语句: ?map.resources :store ,此为REST规则。

map.resources一行代码给我们的应用程序新增了7个路由规则和4个路由辅助方法。

?

通过以下代码可解决页面跳转问题,

map.connect 'store/index',:controller =>'store',:action=>'index',

要在上句之前,在上句之后不能作用。

但是,这会遇到页面中图片引用路径发生改变,图片不能正常显示,待解决。

可能对图片引用路径作些修饰就行了。

}

?

{

调试方法:

如果问题发生在一个Model中,我们可以使用脚本script/console来模拟一个irb对话,在其中进行跟踪,例如下面这样:

Z:\study\ruby\InstantRails\rails_apps\depot>ruby script/console

Loading development environment.

>> pr = Product.find(:first)

=> #<Product:0x4b969ec @attributes={"image_url"=>"http://www.dearbook.com.

>> pr.price

=> #<BigDecimal:4b913d4,'0.12351E3',8(12)>

>> pr.image_url

=> "http://www.dearbook.com.cn/book/BookImage/67/lastTS00168921__.jpg"

>> pr.save

=> true

>>?

我们先在depot项目的命令行中使用ruby script/console来启动irb会话,蓝色的部分是我在irb会话中输入的命令。

?

}

?

{

在做程序时,在model类文件中,添加引用时,服务器可能需要重启才能实现新效果

如“require 'digest/sha1'”,加密方法引用的文件

}

?

{

用户的添加已经实现,用户成功登录未实现,可能存在问题的方法是关于“Digest::SHA1”这种加密密码

方法。

}

?

{

??想要在其它控制器中使用先前的控制器的页面布局,可在要使用先前布局的

控制器中的前面增加语句: layout "引用的布局控制器的名称",

如:layout "admin"

}

?

{

过滤器:

前置过滤器(before_filter)

ApplicationController是所有控制器的父类,可在其中加入过滤方法,如authorize(验证用户),

在子控制器类中的前方,加入 before_filter :authorize.

想要在子控制器类中加入过滤方法,但这子控制器下的某action不想使用过滤,

语句: before_filter :authorize, :except => :action(泛指某action)

?

}

?

?

{

( 为何要检查进入的是否为 HTIP POST 请求呢? 因为这是一个好习惯: 凡是会改

变服务器状态的请求都 应该是 POST .而不应该是 GET 请求。p161

}

?

{

这里的关键概念是用异常来表示删除用户的过程 中出现了错误。这型的异常同时

承担两个任务.首先,在事务内部,异常会导致自动回滚,如果在删除用户之后users

表为空,抛出异常就可以撤销caozuo.html" target="_blank">删除操作,恢复最后 一个用户。

其次,异常可以把错误信息带回给控制器。p163

}

?

{

rake aborted!

Don't know how to build task 'clone_structure_to_test';

?

If you are running Rails 2.x then the correct command is:

rake db:test:clone_structure

?

}

?

{

测试中用到。

require File.dirname(__FILE__)+'/../test_helper'

其中的__为两个下横线。

}

?

?

{

测试模块:

关于购物车Cart(p187)未能通过,出现错误:

ActiveRecord::StatementInvalid: Mysql::Error: Table 'depot_test.cart' doesn't ex

ist: DELETE FROM `cart`

?

已经解决:

不能觉得加入cart_test.rb文件之后,就自以为是在/test/fixtures内添加cart.yml文件,

删除cart.yml即可。

}

?

{

assert_not_nil assigns(:@cart)

@cart为一变量,但上语句是不能通过的,修改为

assert_not_nil assigns(:cart),可通过

}

?

?

{

#添加商品进购物车 in the user_stories_test.rb

# ? ?xml_http_request :get,"/store/add_to_cart",:id => ruby_book.id

# ? ?xhr(:get,{:controller=>'store',:action=>'add_to_cart'},:id=>ruby_book.id )

# ? ?assert_response :success

未能将商品添加到购物车中,等待解决。。。

可能是版本原因,以下可行。

xml_http_request :put, "/store/add_to_cart/#{ruby_book.id}"

}

?

{

新建integration测试命令,如:

ruby script/generate integration_test dsl_user_stories

输出:

?? exists ?test/integration/

?? create ?test/integration/dsl_user_stories_test.rb

?

}

?

{

depot > rake rails:freeze:gems

这个命令会在幕后将簸新版本的 Rails库拷贝到 vendor/rails目录下,当应用程

序启动时,Rails会首先到这里来寻找自己需要的库,然后再寻找全系统共享的版本。

?

如果在困化之后希望取消绑定、继续使系统共享的Rails版本.可以直接把

vendor/rails 目录删掉, 也可以执行下列命令:

depot > rake rails:unfreeze

}

?

{

运行服务器:

ruby script/server -e development ?,默认

ruby script/server -e test

ruby script/server -e production

}

?

{

.find(..)可用参数有:

:all,:first,:conditions,:order,:limit,:offset,:joins,:readonly,:from,:group,:lock

}

?

{

delete()方法绕过了ActiveRecord的回调和验证,而destroy()方法则可以确保调用这些功能。

一般而言,最好是使用destroy()方法,因为这样可以确保进行模型类中定义的业务规则检查,

以保证数据库的完整性。

}

?

{

含有外键字段的表,与其对应的模型类始终应该使用belongs_to声明。

}

?

{

ORM有一个基本原则:数据库调用越少越好

}

?

?

{

ActiveRecord校验辅助方法,它们名字都以validates_开头。

validates_acceptance_of :accept,:allow_nil,:if,:message,:on

validates_associated :allow_nil,:if,:message,:on

validates_confirmation_of :allow_nil,:if,:message,:on

validates_each :allow_nil,:if,:on

validates_exclusion_of :allow_nil,:if,:in,:message,:on

validates_format_of :allow_nil,:if,:message,:on,:with

validates_inclusion_of :allow_nil,:if,:in,:message,:on

validates_length_of :allow_nil,:if,:in,:is,:minimum,:maximum,:message,

:on,:too_long,:too_short,:wrong_length

validates_numbericality_of ::allow_nil,:if,:message,:on,:only_integer

validates_presence_of :allow_nil,:if,:message,:on

validates_size_of :allow_nil,:case_sensitive,:if,:message,:on,:scope

}

?

{

ruby script/console

>> rs=ActionController::Routing::Routes

>> puts rs.routes

?

>> rs.recognize_path "/store"

=> {...}

?

>> rs.generate :controller =>:store

=> {...}

?

}

?

{

路由测试:routing_test.rb

}

?

{

session :off,:only,:except,:if

?

要在整个应用程序范围内禁用session,只要在app/controllers/application.rb加上

代码:

session :off

如果放在某一个控制器内,那么它就只对这个控制器有效。

}

?

{

rails支持有三种不同过滤器:

before,after,around.

?? 后置过滤器可以用于修改输出的应答信息,根据需要改变应答的信息乃至正文。有些

应用程序用这种技术来对控制器模板生成的内容进行全局替换。另一种觉用途是对应答

信息进行压缩。

?? ?环绕过滤器会把action的执行过程包裹在其中。有两种方式可以编写环绕过滤器,

其一,可以把过滤器写成单独的 一段代码,它会在 action执行之前被调用。如果过滤器

代码调用了yield. 那么action 就会被执行。action 执行完毕之后, 过滤器代码会继续执

行。因此,yield 之前的代码就好像是一个前置过滤器,yield 之后的代码则像是后置

过滤器。如果过滤器代码中没有调用yield。action 就不会被执行一一其效果就跟前置

过滤器返回false一样。

}

?

?

{

过滤器中,:only,:except对应多个action时,可用数列表示,如:

before_filter :store, :except => [:delete,:edit_comment]

}

?

{

@files=Dir.glob("/*")

会得到执行根目录的所有文件。

@files=Dir.glob("*")

会得到执行目录下的所有文件,注意是“执行目录”,而不是文件目录。如,

.rb文件在d盘,dos的c:\下执行此文件,将会得到的是c盘下的文件 。

}

?

{

?如果你所编写的表单对应于数据库资源,通常应该用form_for辅助方法来生成表单;

如果表单并不与数据库表直接对应,就可能需要用到比较低级的form_tag辅助方法。

}

?

?

{文本字段

form.text_field()

form.hidden_field

form.password_field

}

?

{

form.text_area

}

?

{单选按钮:

form.radio_button

}

?

{复选按钮:

form.check_box

}

?

{选择列表:

form.select

}

?

{截取文件路径中文件名

C:/NetBeansProjects/test/public/uploads/Image/35/image02.jpg?

我有一个字符串如上,我想通过一个正则表达式把截取最后一个’/‘后的所有字符?

也就是image02.jpg ?这个正则表达式怎么写。谢谢。

?

> File.basename("C:/NetBeansProjects/test/public/uploads/Image/35/image02.jpg")?

另一方法:

> "C:/NetBeansProjects/test/public/uploads/Image/35/image02.jpg".split("/")[-1]?

?

}

?

?

?

?

发表评论
用户名: 匿名