其实已经在机子上有很久了,今天突然翻到有点有用的东西,笔记很重要呀。很乱,当时是简单地放在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
表为空,抛出异常就可以撤销删除操作,恢复最后 一个用户。
其次,异常可以把错误信息带回给控制器。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]
}