灰色的灵魂

黑夜给了我黑色的眼睛, 而我注定要用它来寻找美金

灰色的灵魂 header image 4

Entries Tagged as 'Rails'

Rails Magazine可以下载了

March 15th, 2009 · No Comments · Life

这里可以下载,呃,不知道2009会不会是Rails再次爆发的一年?

[Read more →]

Tags: ·

配置Rails应用

February 13th, 2009 · No Comments · Life

译者注:本文原文来自Rails Guides,版本为January 3, 2009: First reasonably complete draft by Mike Gunderloy。本文根据原文,按照Creative Commons Attribution-Share Alike 3.0授权。
本指南涵盖了可用于Rails应用中的配置和初始化特性。通过本指南,你可以
1.调整Rails应用的行为
2.添加在应用启动阶段运行的代码
本指南的第一版是基于Rails 2.3的源代码撰写的。虽然不保证向前兼容,但是本指南涵盖的信息可广泛地用于Rails 2.2。
1. 初始化代码的位置
Rails(至少)提供了五个好位置来放置初始化代码:

预初始化器(preinitializers)
environment.rb
针对特定环境的配置文件
初始化器(load_application_initializers)
后初始化器(After-Initializers)

2. 使用预初始化器
Rails允许你使用一个预初始化器,在框架自身被装载前来运行代码。如果你把代码存放在RAILS_ROOT/config/preinitializer.rb中,这些代码会在任何框架组件(Active Record, Action Pack, and so on)之前第一个被装载。如果你想要改变任何初始化过程中某些类的行为,你可以在这里(preinitializers文件)做。
3. 配置Rails组件
基本上来说,配置Rails所做的工作就是配置Rails自身以及配置Rails的各个组件。environments.rb文件以及针对特定环境的配置文件(比如config/environments/production.rb)允许你设定各个组件的设置。例如,默认的Rails2.3中的environment.rb文件中包含这样一条配置:

config.time_zone=’UTC’

这是一条Rails自身的设置。如果你想要设定Rails的各个组件的设置,你也可以通过同样的这个config对象来做:

config.active_record.colorize_logging = false

Rails会使用这条设置来配置Active Record
3.1 配置Active Record
ActiveRecord::Base包含许多种配置选项:

logger接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger,该logger会传递给所有的新创建的数据库连接。你可以在ActiveRecord的model类或者其实例上调用logger来获取该logger。把该值设为nil会经用日志功能。
primary_key_prefix_type用于设置主键列的命名。Rails默认主键列的名字是id(该配置无需设定),但是你可以有两个别的选择:

:table_name会另Customer类的主键为customerid
:table_name_with_underscore会另Customer类的主键为customer_id

table_name_prefix使你可以在表名的前面设置添加一个全局的字符串。如果你将该值设为northwest_,那么Customer类会映射到northwest_customers表。默认该值为一个空字符串
table_name_prefix使你可以在表明的后面设置添加一个全局的字符串。如果你将该值设为_northwest,那么Customer类会映射到customers_northwest表。默认该值为一个空字符串。
pluralize_table_names规定了Rails使用单词的单数还是复数来命名数据库中的表名。如果该值被设置为true(默认值),那么Customer类会使用customers表,如果该值被设置为false,那么Customer类会使用customer表
colorize_logging(默认为true)规定了在ActiveRecord的日志信息中是否使用彩色的ANSI代码。
default_timezone决定了在从数据库中读取日期和时间时,是使用Time.local(如果设置为:local)还是Time.utc(如果设置为:utc)。默认值为:local
schema_format控制了从数据库中导出数据库模式到文件中所用的格式。选项:ruby(默认值)会使用一个数据库无关的migrations,选项:sql会使用(可能依赖于特定数据库的)SQL指令。
timestamped_migrations控制了migrations的数字是使用连续的整数还是时间戳。默认值为true,代表使用时间戳,这在优多人共同开发同一个应用的时候是一个更好的选择。
lock_optimistically控制了ActiveRecord是否使用乐观锁。默认该值为true
MySQL适配器增加了一个额外的配置选项:
ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans控制了ActiveRecord是否认为MySQL数据库中所有的tinyint(1)列为布尔值。默认该值为true
数据库模式的导出器(schema dumper)增加了一个额外的配置选项:
ActiveRecord::SchemaDumper.ignore_table接受一个表名的数组,该数组中的表不应包含在任何生成的数据库模式文件中。该设置在ActiveRecord::Base.schema_format == :ruby时才会起作用。

3.2 配置Action Controller
ActionController::Base包含了一些配置设定:

asset_host在所有AssetHelper中的辅助方法所生成URL的前面添加一个字符串。这是设计用来将所有的javascript,CSS以及图片文件转移到一个不同的主机(asset host)上。
consider_all_requests_local通常在开发环境中被设为true而在生产环境中被设为false;如果它被设为true,则任何错误都会导致详细的调试信息会被导出到HTTP response中。如果你想做更细致的控制,将其设为false然后实现local_request?方法来决定哪些requests会在出错的情况下提供调试信息。
allow_concurrency为了允许同步(线程安全的)的action处理,该值应当被设为true。默认情况下该值为false。你通常不应当直接修改这个配置,因为你需要一系列的其他调整使得线程安全模式可以正确地工作做。你可以在production.rb文件中简单地调用config.threadsafe!,它会为你做所有需要的调整。

Threadsafe操作和开发模式下的一些功能不兼容。特别是自动的依赖装载和类重装载会在你调用config.threadsafe!之后被自动禁用

param_parsers让你可以设置一个handlers的数组,用于提取HTTP requests中的信息并将它放到params哈希中。默认情况下,multipart forms,URL-encoded forms,XML以及JSON的parsers是被激活的。
default_charset设定了所有render默认使用的字符集。默认值为”utf-8″
logger接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger,可以被用来在Action Controller中记录日志信息。把该值设为nil会禁用日志功能。
resource_action_separator用来设置RESTful url中resource和action之间的分隔符。默认为”/”。
resource_path_names用来设置一个RESTful action默认的名字的哈希。默认情况下,new action被命名为new而edit action被命名为edit。
request_forgery_protection_token用来设置RequestForgery的参数名。调用protect_from_forgery会将它设为:authenticity_token
optimise_named_routes打开了一些生成路径表(routes table)的优化。它默认被设为true
use_accept_header用于设置确定response格式的规则。如果该值设为true(默认值),则respond_to方法和Request#format方法会根据Accept Header返回相应格式的response。弱该值设为false则request格式会单独由params[:format]来决定。如果没有format参数,则response的格式会根据request是否是一个Ajax request来决定返回HTML还是Javascript。
allow_forgery_protection用于设置启用还是禁用CSRF保护。默认在测试模式下该值为false而在其他模式下为true。
relative_url_root可以被用来告诉Rails你将会将应用部署到一个子目录。默认值为ENV['RAILS_RELATIVE_URL_ROOT']
缓存功能代码将会增加两个额外的设置:
ActionController::Caching::Pages.page_cache_directory用于设置Rails为你的Web服务器创建缓存页面的位置。默认值为Rails.public_path(通常该值被设为RAILS_ROOT”/public”+)。
ActionController::Caching::Pages.page_cache_extension用于设置生成的缓存页面文件的扩展名(如果进来的requests已经带了扩展名则这里的扩展名会被忽略)。默认值为.html。
分发器(dispatcher)包含了这样一条配置
ActionController::Dispatcher.error_file_path给定了Rails用来寻找出错文件如404.html的路径。默认值为Rails.public_path。
使用Active Record的session存储可以这样来配置
CGI::Session::ActiveRecordStore::Session.data_column_name用于设置用来存储session数据的列名。默认值为’data’。

3.3 配置Action View
Action [...]

[Read more →]

Tags: ··

functional tests中的form_authenticity_token

February 9th, 2009 · 3 Comments · Life

又是一个前一阵遇到的很tricky的问题。
Rails2.0中加入了form_authenticity_token来防止部分的cross-site的攻击,ActionView中默认的form_for标签会自动加入类似于

的代码,如果你自己使用form_tag来创建form的话,可以用类似于

<input type=”hidden” name=”authenticity_token” value=”<%= “#{form_authenticity_token}” %>” />

的代码来加入这个隐藏的form中的authenticity_token。
但是手工加入这个token在functional tests中会带来问题,因为functional tests中是把allow_forgery_protection关掉的
可以在environments/test.rb中看到这样的配置

config.action_controller.allow_forgery_protection = false

但是authenticity现在是hardcode在代码中,所以跑functional tests通常会遇到这样的错误

ActionView::TemplateError: No :secret given to the #protect_from_forgery call. Set that or use a session store capable of generating its own keys (Cookie Session Store).

一种解决办法是在view中加入当前all_forgery_protection状态的判断代码,比如

<input type=”hidden” name=”authenticity_token” value=”<%= “#{form_authenticity_token}” %>” />

但是有位同学用了个更巧妙的hook的办法,在test_helper.rb中hook掉form_authenticity_token,如下

module ActionController
module RequestForgeryProtection
def form_authenticity_token
[...]

[Read more →]

Tags: ··

在新macbook上安装Rails+MySQL

February 9th, 2009 · No Comments · Mac, Tech

嗯,嗯,嗯,这个问题前一阵来来回回折腾过不少时间,主要的问题在于

Macbook 466是64位的CPU
Leopard自带的Ruby是32位的版本
如果安装的MySQL是64位版本的,就需要自己编译个Ruby
要不你就像我这样还是装个32位的MySQL吧

MySQL安装的注意事项

建议安装Startup Item,这样就开机自启动了
如果装了Startup Item但是不想开机自启动,那就修改/etc/hostconfig,把MYSQLCOM=-YES-改成MYSQLCOM=-NO-
默认的encoding是latin1,所以要改一下配置文件,按下面这么办就行了

$ sudo cp /usr/local/mysql/support-files/my-small.cnf /etc/my.cnf
$ sudo vim /etc/my.cnf
# 在对应的节点添加如下信息
[client]
default-character-set = utf8
[mysqld]
character-set-server = utf8
default-table-type = innodb
记得数据库创建要在改完配置重启mysqld之后,不然创建的数据库默认还是latin1的
然后就是gem安装mysql的驱动了,抛弃掉Rails自带的过时的ruby版本的驱动了

sudo env ARCHFLAGS=”-arch i386″ gem install mysql — –with-mysql-config=/usr/local/mysql/bin/mysql_config

如果您装的是64位的Ruby和MySQL那么改一个参数吧

sudo env ARCHFLAGS=”-arch x86_64″ gem [...]

[Read more →]

Tags: ···

奥妙的Rails

November 27th, 2008 · 2 Comments · Life

发现这个东西的确写同样功能比起Java来,十分之一的代码都用不上。不过问题是……我要多花10倍的时间研究到底怎么把这十分之一的代码给写出来……
所以结果其实也没节省时间。

[Read more →]

Tags: ··