Skip to content

Category Archives: Ruby/Ruby on Rails

在Yii使用Mixin – Behavior

我们知道Ruby有Mixin的功能,可以扩展类的实例方法或者类方法,只需要include就可以做这样的事情,但是PHP好像没有这样好用的方法?但是在Yii有这样的方法,怎么实现呢?
下面有一个例子:

 
Yii::app()->fileCache->attachBehavior(’EFileCacheBehavior’, array(’class’=>’EFileCacheBehavior’));

如果要在App启动的时候就能永这个EFileCacheBehavior,可以在Main.php配置这个文件…

‘fileCache’=>array(
‘class’=>’application.extensions.filecache.EFileCache’,
‘autoCleanExpiredCache’=>false,
‘behaviors’=>array(
‘EFileCacheBehavior’=>array(
[...]

Ruby 读取目录(Diretories),文件(files), 网页的几个方法小结

* 因为经常在console下面工作,操作文件的命令都还可以,但是想想用程式来操作,那也是更有意思,特别是在shell程序的时候…
* 熟悉*inx命令的人,相信对这些ruby的方法会很熟悉的
1. 操作目录(Directories)
A. 创建

Dir.chdir( “/Users/weston” ) #进入目录
home =Dir.pwd # => “/Users/weston/” * 显示目录
Dir.mkdir( “/Users/weston/” ) #创建目录,和*nix命令一样吧
Dir.rmdir( “/Users/weston/test” ) # 删除目录
Dir.mkdir( “/Users/weston/test”,755 ) #常见目录,设置权限

B.查看

d = Dir.entries( “/Users/weston” ).each { |e| puts e } #=> Array
 
# 当然会有些隐藏文件,很方便的用数组操作,不显示隐藏文件
 
d2 = d.delete_if{ |e| e=~ /^\..*/} #=>这样出来的就是不包含隐藏文件了

C. 打开目录

dir = Dir.open( “/Users/weston” ) # => #<Dir:0×1cd784>
dir.path # => [...]

PHP 跨站点脚本攻击

* http://www.w3pop.com/learn/view/p/5/o//doc/php_xss/
PHP:用javascript来防止吧
或者考虑检查 $_SERVER['HTTP_REFERER'] * 但是别人是可以修改这个值的,所以不是完全的完全的
或者用和rails一样的解决方法
根据一个惟一的字符串或时间戳生成一个令牌,并将这个令牌放在会话变量和表单中
要创建随机的令牌,可以使用 PHP 内置的 md5()、uniqid() 和 rand() 函数,如下所示:

<?php
session_start();
 
if ($_POST[’submit’] == "go"){
//check token
if ($_POST[’token’] == $_SESSION[’token’]){
//strip_tags
$name = [...]

关于Rails模板系统的运行原理(ERP & Binding)

一直想看研究Rails的模板系统, 但总是有各种各样的原因,给延误了,之前也和我的同事Jerry Guo讨论过这个问题,但是一直没有把结果写出来,Jerry的这篇文章相信解了很多同学的疑问了…
大家可以到这里访问: http://hozaka.blogspot.com/2008/08/actionview-erb-binding.html

查询订单demo

如果客户订的EVF比送的REDONE多,而且那些EVF还没有全部送货

lines = ERP::SalesLine.find(:all,
:conditions => [’item_id = ? OR item_id = ?’, ‘301001′, ‘101001′],
:joins => ‘JOIN erp_sales_orders ON erp_sales_orders.id = erp_sales_lines.erp_sales_order_id
JOIN erp_customers ON erp_customers.id = erp_sales_orders.erp_customer_id’
)
 
result = {}
 
lines.each do |line|
 
unless result.key?( account = line.sales_order.customer.account_num)
result.merge!( account => { :red_one => 0, :evf => 0, :remain_sales_physical [...]

关于rails引用binding的对话

* 以下是我同事Jerry的谈话介绍
鸡蛋黄(77883817) 19:29:17
我说的简单了点,真正的 Rails 的代码会另外复制一个状态创造 binding 的
鸡蛋黄(77883817) 19:29:44
比如有个模板是
鸡蛋黄(77883817) 19:30:09
然后有个对象
class People
def initialize(name)
@name = name
end
end
鸡蛋黄(77883817) 19:30:29
那么 People.new(“your name”).send(:binding) 就会得到一个 binding 对象
鸡蛋黄(77883817) 19:30:51
可以说这个对象就是保存了这个 people 实例的环境,自然包括了 @name
微风(297749) 19:31:13
binding是这个对象的context,可以这样理解?
鸡蛋黄(77883817) 19:31:15
ERB.new(“”).result( binding ) 能得到结果
鸡蛋黄(77883817) 19:31:17
可以
鸡蛋黄(77883817) 19:31:35
有了binding
鸡蛋黄(77883817) 19:31:42
甚至可以调用私有方法……
古月星辰(65009835) 19:31:44
可以给action指定layout吗?
鸡蛋黄(77883817) [...]

Ruby long string block(ruby长字符串的处理)

http://rubyluabridge.rubyforge.org/
*主要是为了使用long string,不用写些转义字符…

 
l.eval <<LUA_END
n = 5 — see how Ruby long strings
s = "hello" [...]

RAIL的优化…(10)

Ruby On Rails的常用武器

Autotest: 开始编码了? 第一件事是打开Autotest,结束编码了,最后一件事是关闭Autotest。编码的过程中, 应该一直让autotest开着,它会一直检测你的代码改动,自动持续运行测试,是最好的TDD工具。
Rspec :抛弃Rails原有的测试框架吧,这个更优秀。
Mocha:可以让你轻易实现Mock功能,非常好用,语法如英文般自然。
Selenium:项目稳定后,可以用来做交付测试,自动启动浏览器,完全模拟人的鼠标键盘点击,进行测试。
Cruise Control:持续集成,在源代码服务器端验证运行测试代码,确保不会出现“it works for me”,文件漏提交,以及开发环境不同带来的bug等问题。

Block, Closures And Proc(块,闭包和Proc)的关系

a = 1
pr = Proc.new{ puts a }
闭包可以用Proc来创建,参数是block…
This example shows a return failing because the context of its block no longer exists.
def meth2(&b)
b
end
*因为block是没有上下文(环境),如果你都没有在办公室这个环境,我当然不能叫你出办公室.
但是闭包就不一样啊,闭包有自己的上下文,所以可以用这个以下方法
* 补充: return 会返回值(true, false, nil,其他,后面的代码就补执行),它的接受者是调用它的对象…接受者都没有,当然会出错…
*block只是代码块的匿名函数…或者说一个环境的一个配件…

 
def meth4
p = Proc.new { return 99 }
p.call
puts “Never get here”
end
meth4 → 99

*p是一个proc创建的闭包,有自己的上下文(环境),所以可以return…
*block 是closure, 它能记住其被定义时的上下文, 并再调用时使用该上下文:

 
 
class Holder
CONST = 100
def call_block
a [...]