Archive for the 'ruby on rails' Category

遗留系统模型处理

Wednesday, November 11th, 2009

class BillingLog < ActiveRecord::Base
set_table_name “stt.billing_log”

def self.get_pk
BillingLog.columns.first.name.to_s
end

set_primary_key self.get_pk

###BEGIN###
#注意请勿修改BEGIN和END两行!!!!!!
#请在以下空白处进行所需要的修改
#出了BEGIN END注释块外的修改将在下一次代码生成时被覆盖

def to_url
“/billing_log/#{id}.html”
end

###END###
end

Rails time_zone时间比较.

Monday, April 6th, 2009

In config/environment.rb:
config.time_zone = ‘Beijing’
Rails Will store time in UTC in the database.
in action:
@actions = Action.all(:conditions=>[”status=’C0A’ and completed_at>? “,DateTime::now.beginning_of_day])
DateTime::now valued in UTC+8(Bejing)
should replace to :
@actions = Action.all(:conditions=>[”status=’C0A’ and completed_at>? “,DateTime::now.utc.beginning_of_day])

Textile templates with Rails

Wednesday, July 16th, 2008

http://snafu.diarrhea.ch/blog/article/2-textile-templates-with-rails

rails page cache with subdomain

Wednesday, April 23rd, 2008

ruby on rails在默认情况下对于同一个应用的多个域名的page cache是不能区分目录的..对于一些应用来说会有些麻烦,比如多用户blog系统,或是cms系统的不同频道指定不同二级域名(如:http://finance.sina.com.cn)的时候,index页面是无法正常工作的(写到这里突然想起来应该先去看看typo,Mephisto等系统的实现)..对于这个问题郁闷了很久…其实解决办法也很简单..就是对于不同的二级域名的page cache的文件保存到不同目录,然后通过web服务器提供的url rewrite功能来重写请求.(对于非二级域名的多域名应用的情况下,只要指定整个域名为cache目录也可以解决.)
e.g:
http://wap.upulife.com => /public/wap/index.html
http://finance.upulife.com => /public/finance/index.html
代码:

#实现subdomain page cache功能.
module ActionController::Caching::Pages
def cache_page(content = nil, options = {})
return unless perform_caching && caching_allowed
subdomain = ‘’
#TODO: 需要确认 .com.cn 等域名(3段)不加www的情况下是不是 request.subdomains.first.blank?
#顶级域名不写子目录,??? rewrite rule如何写呢?
unless request.subdomains.first.blank? […]

“He couldn’t keep his own servers running for longer than 4 minutes on average.”

Thursday, January 3rd, 2008

Rails Is A Ghetto
非常精彩的文章,用我仅有初中多一点点的英语水平花了很长时间认真读完的.
看完什么感受呢?正在消化回味…..
其实原来一直觉的为什么国外那么多开源国内没有是不是因为人家不需要为生活奔波,看了这篇文章发现好像不是了.
为什么呢?奉献精神,风气?
其实如果那些下载源代码使用的人做的第一件事情不是修改powered by ,修改作者,修改源代码里面的注释的话,不是觉得作者开源是理所应当的,不觉的作者回答各种各样sb问题和添加个性化需求是义务的话.或许会有跟多人愿意做这个事情.
“Who?”
That’s right, dude works on Rails in some capacity, apparently writing tons of shitty fucking code with his butt buddy Nicholas Sekar. Yet, nobody knows him. He’s got more web sites than Elvis and Chuck Noris combined and nobody knows him. He’s written mountains more open source code than me […]

用Vim开发rails?那么试一试这个插件吧.

Monday, October 29th, 2007

Redit 是 TextMate Footnotes的vim版本.
script/plugin install http://svn.antono.info/redit
rake redit:install
将生成一个: redit_controller.rb
什么用呢?
用处一: 当访问默个action(render是包含layout)时:
生成脚注
Edit: Controller | View | Layout
Show: Session | Cookies | Params | Log | General Debug
(Redit Footnotes)
其中点击edit后面的那些选项时是在vi(可定制)中打开的.有用吗?其实有时候输入Rcont,Rview,Rlayout也挺累的,呵呵.
用处二: 比如说代码出错了:
NameError in ReditController#index
undefined local variable or method `aa’ for #
RAILS_ROOT: /home/leo/work/vi/config/..
Application Trace | Framework Trace | Full Trace
#{RAILS_ROOT}/app/controllers/redit_controller.rb:4:in `index’
/usr/bin/mongrel_rails:16:in `load’
/usr/bin/mongrel_rails:16
那么将在这3行:
#{RAILS_ROOT}/app/controllers/redit_controller.rb:4:in `index’
/usr/bin/mongrel_rails:16:in `load’
/usr/bin/mongrel_rails:16
生成链接,点击后自动在vim中打开对应的文件并定位于相应的行.
当然了你可以修改redit_controller的代码使用其他编辑器.
调试的时候方便多了,不错不错.
哦,你完全TDD,那么可能就没什么用喽..

Rails Cache + SSI 续。

Friday, September 14th, 2007

上次只是说理论,实际上按照上次的做法做完后,第一次访问的时候http server是不会解析.shtml里面的指令的,所以第一次访问生成cache文件的时候访问者看到的inc是没include进来的。(因为是在404的时候才到dispatch.fcgi的–我是lighttpd+fastcgi跑的,其他应该一样)。
在application.rb最前面(类定义上面)加上如下处理就可以了。

module ActionController
module Caching
module Pages
def cache_page(content = nil, options = {})
return unless perform_caching && caching_allowed
path = url_for(options.merge(:only_path => true, :skip_relative_url_root => true, :format => params[:format]))
[…]

别让REST暴露了你的数据结构。

Tuesday, September 4th, 2007

REST在我的项目中还没用上,因为我不知道用在哪里–有什么好处(可能是理解不够),但是这并不阻止我的学习、思考。刚刚看了看rails generate scaffold_resource生成的一段代码:

def index
@medias = Media.find(:all)
respond_to do |format|
format.html # index.rhtml
format.xml { render ml => @medias.to_xml }
end
end

访问:http://localhost:3000/medias.xml的结果是XML文档,表数据和字段名(默认全部字段)。。。
这有什么问题呢?
1.系统安全,暴露表结构是很严重的问题。。。如果程序的默个地方还有sql注入之类的问题,有能看到表结构的话就更严重了。其实在new form中直接用字段名作为input的名称这也是很不好的(input名称这一点好像在一个rails的安全指南中提到过)。
2.数据安全,最简单的说如果有人想抓取网站数据的话,处理xml,yml比起解析html来说是方便太多了。
可以通过 to_xml的:only,:except 限制输出字段,详见api文档。
以前写的:浅谈B/S系统安全
ps:今天把自己写的一些常用的东西写到一个plugin里面去了,感觉相当爽,用起来方便多了。呵呵。

Rails cache机制和SSI结合实现高性能内容发布系统

Thursday, August 23rd, 2007

实践出真理。。(呵呵,也深沉一把)
灵活性和高性能是所有web(不只是web)开发者的共同追求。动态页面呢是灵活,可是效率太低。。生成静态页面呢效率高了又不够灵活,SSI(.shtml)机制是一个非常好的解决方案,这个已经不需要论证了看看主要门户就知道了。。
在开发CF-CMS的过程中我们使用了非常复杂的生成机制(包括取数、碎片,队列、生成管理、实时预览等)来生成.shtml文件和inc文件,之所以说它复杂是因为核心代码主要就是生成机制了(当然除了生成外还有取数模块),而我的主要工作也集中在这里。但是。。但是由于需要定时/不定时大批量的生成效率并不是很高(我已经很努力的优化了,而且服务器性能绝对不差),特别是初始化系统的时候需要将系统中的数据全量生成更是让人郁闷的事情。
在开发的后期(5月份)我想到了通过rails的cache机制和ssi结合的办法来实现。这样的好处是
1)系统不需要全量初始化。页面等到有访问的时候才生成(虽然不是用在这里但是这个想法已经被我发扬光大了^_^)。2)更新或是删除实体的时候不需要进生成队列不需要管理,只要简单的将cache失效就可以了。3)不需要实现预览机制。4)不需要第四了,前面3点足够了。
比如一个博客程序(生成静态文件的实现):
原来的实现方式是:发表篇文章则需要,1)重新生成列表数据。2)生成发表的post的文件。3)如果你的模板的sidebar里面有”最新文章”列表这需要从新生成所有实体的文件。(当然了你可以用javascript,你喜欢吗?还有seo问题呢)
cache+ssi实现:发表文章,1)清除列表数据的cache,2)发表的post有人访问的时候自动生成,3)sidebar里面的”最新列表”我们可以在模板里面把最新列表定义为一个inc,这样写inc文件就好了.
这样比较下来 1)实现非常容易,不需要什么生成啊队列啊. 2)系统效率应该是高非常多的(具体数据没测试过)。而且不会发生突发的大批量生成的任务。对系统处理能力的压力减小很多。
关于生成队列:这个东西还是可以保留的,比如在你为文章加上统计啊,热点的时候每次访问重新生成一次是不合理的。可以有一个延迟规则,符合这个规则的时候触发cache的清除。
如何实现:实现起来很简单了。1)把mapping中的url全部改为.shml结尾。2).设置controller的cache和cache失效规则(Sweeping).
打字很累。。upulife.com保留所有权利。。转载请注明出处:http://www.upulife.com
关于CF-CMS:这个项目已经完成。但是我觉的可能刚开始的时候目标定的太高了虽然大部分目标都实现了。但是系统复杂性太高,可能不大适合个人用户或是小团队使用。所以在后来的一些空闲时间(大概2天)我又实现了一个简化版本基本符合个人要求(比如实现个新闻系统,博客系统啊,下载站啊游戏站啊)是没问题了。而且基本使用cache+ssi的方式,最近比较忙,还未完全实现,等整理一些准备开源(考虑中…)

REST是什么?

Friday, July 27th, 2007

其实昨天想写的叫“REST迷思”,不过今天看到这篇文章,我也”REST是什么?”
昨天整个下午我都在想REST到底是什么?我为什么要用它?应该用在什么地方?在骑车出门的时候还不停的在想,也没想很明白,本来还想发篇博客问问,没想到今天就有了。总的来说我还是比较同意dongbin的那篇文章的。
真正开始了解REST就是前一段时间,其实也不能说了解,就是看了一些介绍和视频。我也犯了老毛病,学到新东西就拼命的想往现在的项目上靠,美其名曰”学用,学用,学以致用”。
首先就碰到问题了。
1.比如:图书网站,有很多的书本,而书本属于某个用户。现在要开发图书列表和用户的图书列表。其实就是
/books/list
/users/leo/books or /users/leo/book_list or /users/leo/books/list
原来的想都不想两个action,处理book.find
当然了如果一个action可以优雅的解决问题那我还是趋向于一个action实现的,DRY嘛。(只是if else太不优雅了)
怎么用到REST呢?按模型来说,是这样的.
map.resources :users do |users|
users.resources :books
end
事实上这个是实现不了/books/list的。那就不用nested resources了,还是Controller加个action(哦,我可不喜欢/books;list_by_user这样的URL),还是增加一个controller?
那么那么,主要问题是什么呢(Ok,我个人的问题)?原来我的实现是直接从业务(需求,用户接口)映射到实现上来的,使用REST思考的时候呢?从model来考虑的? 至顶向下还是至底向上呢这是个问题。
用Rest是为很酷而又方便的url mapping吗?为了方便的列出model的关系吗?
2.一本书有很多章节.那么我的章节列表应该放在:
/books/1/sections (sections.index)
/books/1 (books.show)
里面呢? 如果按照Web Service的做法或是把REST当做Model的HTTP方式的接口(把book看做Resource)的话那么应该是在sections.index里面。而按照习惯我可能更喜欢/book/1里面显示sections list(至少,至少少一次点击。)。
Rest是Model的http接口吗?
3.“REST的主要优势在我看来其实在于它是一种对于服务器的更加有效的抽象方式。”(引用1)
按照这么说的话,个人认为REST并不适合于仅仅使用GET/POST的WEB应用的开发。在form里面加一个method的hidden变量然后把网址变成book;edit这样有意义吗?为了漂亮的mapping?只要你会写routes什么样的mapping写不出来?为了根据不同的format请求返回不同的结果?不用rest你也可以responds_to不同的format。
从WS的角度来说REST用HTTP的请求方式来映射function-name,只是为了方便理解?
到此以我对REST的理解来说我已经想不下去了,一团麻了。
REST到底是什么,适合我吗? 突然间我想到了04年刚刚接触敏捷是写的“你敏捷得起来吗?”,那么REST适合你吗?
上面的文字有太多的问号,正如我现在对于REST的问号。不过我觉的似乎从我现在的理解来说REST不适合于实用至上的我现在进行的这些项目。
引用1:http://blog.csdn.net/mozilla/archive/2007/06/07/1643095.aspx