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)

=> #"http://www.dearbook.com.

>> pr.price

=> #

>> 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] 

 

}

 

 

 

 

你可能感兴趣的:(Rails,Ruby,正则表达式,应用服务器,ActiveRecord)