<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>灰色的灵魂 &#187; Rails</title>
	<atom:link href="http://www.xuwenhao.com/tag/rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.xuwenhao.com</link>
	<description>生命如此短暂，掌握技艺却要如此长久</description>
	<lastBuildDate>Fri, 27 Jan 2012 11:23:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Rails Magazine可以下载了</title>
		<link>http://www.xuwenhao.com/2009/03/15/rails-magazine-pd-now-available/</link>
		<comments>http://www.xuwenhao.com/2009/03/15/rails-magazine-pd-now-available/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 07:34:41 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=739</guid>
		<description><![CDATA[这里可以下载，呃，不知道2009会不会是Rails再次爆发的一年？]]></description>
			<content:encoded><![CDATA[<p><a href="http://railsmagazine.com/issues/1" target＝"_blank">这里</a>可以下载，呃，不知道2009会不会是Rails再次爆发的一年？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/03/15/rails-magazine-pd-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配置Rails应用</title>
		<link>http://www.xuwenhao.com/2009/02/13/configuring-rails-applications/</link>
		<comments>http://www.xuwenhao.com/2009/02/13/configuring-rails-applications/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 15:54:11 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=696</guid>
		<description><![CDATA[译者注：本文原文来自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（该配置无需设定），但是你可以有两个别的选择： [...]]]></description>
			<content:encoded><![CDATA[<p>译者注：本文<a href="http://guides.rails.info/configuring.html" target="_blank">原文</a>来自<a href="http://guides.rails.info" target="_blank">Rails Guides</a>，版本为January 3, 2009: First reasonably complete draft by Mike Gunderloy。本文根据原文，按照<a href="http://creativecommons.org/licenses/by-sa/3.0" target="_blank">Creative Commons Attribution-Share Alike 3.0</a>授权。</p>
<p>本指南涵盖了可用于Rails应用中的配置和初始化特性。通过本指南，你可以<br />
1.调整Rails应用的行为<br />
2.添加在应用启动阶段运行的代码</p>
<p>本指南的第一版是基于Rails 2.3的源代码撰写的。虽然不保证向前兼容，但是本指南涵盖的信息可广泛地用于Rails 2.2。</p>
<h2>1. 初始化代码的位置</h2>
<p>Rails（至少）提供了五个好位置来放置初始化代码：</p>
<ul>
<li>预初始化器（preinitializers）</li>
<li>environment.rb</li>
<li>针对特定环境的配置文件</li>
<li>初始化器(load_application_initializers)</li>
<li>后初始化器（After-Initializers）</li>
</ul>
<h2>2. 使用预初始化器</h2>
<p>Rails允许你使用一个预初始化器，在框架自身被装载前来运行代码。如果你把代码存放在<code>RAILS_ROOT/config/preinitializer.rb</code>中，这些代码会在任何框架组件（Active Record, Action Pack, and so on）之前第一个被装载。如果你想要改变任何初始化过程中某些类的行为，你可以在这里（preinitializers文件）做。</p>
<h2>3. 配置Rails组件</h2>
<p>基本上来说，配置Rails所做的工作就是配置Rails自身以及配置Rails的各个组件。<code>environments.rb</code>文件以及针对特定环境的配置文件（比如<code>config/environments/production.rb</code>）允许你设定各个组件的设置。例如，默认的Rails2.3中的<code>environment.rb</code>文件中包含这样一条配置：</p>
<pre name="code" class="ruby">
config.time_zone='UTC'
</pre>
<p>这是一条Rails自身的设置。如果你想要设定Rails的各个组件的设置，你也可以通过同样的这个<code>config</code>对象来做：</p>
<pre name="code" class="ruby">
config.active_record.colorize_logging = false
</pre>
<p>Rails会使用这条设置来配置Active Record</p>
<h3>3.1 配置Active Record</h3>
<p><code>ActiveRecord::Base</code>包含许多种配置选项：</p>
<ul>
<li><code>logger</code>接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger，该logger会传递给所有的新创建的数据库连接。你可以在ActiveRecord的model类或者其实例上调用<code>logger</code>来获取该logger。把该值设为nil会经用日志功能。</li>
<li><code>primary_key_prefix_type</code>用于设置主键列的命名。Rails默认主键列的名字是<code>id</code>（该配置无需设定），但是你可以有两个别的选择：
<ul>
<li><code>:table_name</code>会另Customer类的主键为<code>customerid</code></li>
<li><code>:table_name_with_underscore</code>会另Customer类的主键为<code>customer_id</code></li>
</ul>
</li>
<li><code>table_name_prefix</code>使你可以在表名的前面设置添加一个全局的字符串。如果你将该值设为<code>northwest_</code>，那么Customer类会映射到<code>northwest_customers</code>表。默认该值为一个空字符串</li>
<li><code>table_name_prefix</code>使你可以在表明的后面设置添加一个全局的字符串。如果你将该值设为<code>_northwest</code>，那么Customer类会映射到<code>customers_northwest</code>表。默认该值为一个空字符串。</li>
<li><code>pluralize_table_names</code>规定了Rails使用单词的单数还是复数来命名数据库中的表名。如果该值被设置为<code>true</code>（默认值），那么Customer类会使用<code>customers</code>表，如果该值被设置为<code>false</code>，那么Customer类会使用<code>customer</code>表</li>
<li><code>colorize_logging</code>（默认为true）规定了在ActiveRecord的日志信息中是否使用彩色的ANSI代码。</li>
<li><code>default_timezone</code>决定了在从数据库中读取日期和时间时，是使用<code>Time.local</code>（如果设置为<code>:local</code>）还是<code>Time.utc</code>（如果设置为<code>:utc</code>）。默认值为<code>:local</code></li>
<li><code>schema_format</code>控制了从数据库中导出数据库模式到文件中所用的格式。选项<code>:ruby</code>（默认值）会使用一个数据库无关的migrations，选项<code>:sql</code>会使用（可能依赖于特定数据库的）SQL指令。</li>
<li><code>timestamped_migrations</code>控制了migrations的数字是使用连续的整数还是时间戳。默认值为<code>true<code>，代表使用时间戳，这在优多人共同开发同一个应用的时候是一个更好的选择。 </li>
<li><code>lock_optimistically</code>控制了ActiveRecord是否使用乐观锁。默认该值为<code>true</code></li>
<p>MySQL适配器增加了一个额外的配置选项：</p>
<li><code>ActiveRecord::ConnectionAdapters::MysqlAdapter.emulate_booleans</code>控制了ActiveRecord是否认为MySQL数据库中所有的<code>tinyint(1)</code>列为布尔值。默认该值为<code>true</code></li>
<p>数据库模式的导出器（schema dumper）增加了一个额外的配置选项：</p>
<li><code>ActiveRecord::SchemaDumper.ignore_table</code>接受一个表名的数组，该数组中的表不应包含在任何生成的数据库模式文件中。该设置在<code>ActiveRecord::Base.schema_format == :ruby<code>时才会起作用。</li>
</ul>
<h3>3.2 配置Action Controller</h3>
<p><code>ActionController::Base</code>包含了一些配置设定：</p>
<ul>
<li><code>asset_host</code>在所有<code>AssetHelper</code>中的辅助方法所生成URL的前面添加一个字符串。这是设计用来将所有的javascript，CSS以及图片文件转移到一个不同的主机（asset host）上。</li>
<li><code>consider_all_requests_local</code>通常在开发环境中被设为<code>true</code>而在生产环境中被设为<code>false</code>；如果它被设为<code>true</code>，则任何错误都会导致详细的调试信息会被导出到HTTP response中。如果你想做更细致的控制，将其设为<code>false</code>然后实现<code>local_request?</code>方法来决定哪些requests会在出错的情况下提供调试信息。</li>
<li><code>allow_concurrency</code>为了允许同步（线程安全的）的action处理，该值应当被设为<code>true</code>。默认情况下该值为<code>false</code>。你通常不应当直接修改这个配置，因为你需要一系列的其他调整使得线程安全模式可以正确地工作做。你可以在<code>production.rb</code>文件中简单地调用<code>config.threadsafe!</code>，它会为你做所有需要的调整。</li>
<p><br/></p>
<div style="background: ORANGE;">Threadsafe操作和开发模式下的一些功能不兼容。特别是自动的依赖装载和类重装载会在你调用config.threadsafe!之后被自动禁用</div>
<p><br/></p>
<li><code>param_parsers</code>让你可以设置一个handlers的数组，用于提取HTTP requests中的信息并将它放到<code>params</code>哈希中。默认情况下，multipart forms，URL-encoded forms，XML以及JSON的parsers是被激活的。</li>
<li><code>default_charset<code>设定了所有render默认使用的字符集。默认值为"utf-8"</li>
<li><code>logger</code>接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger，可以被用来在Action Controller中记录日志信息。把该值设为nil会禁用日志功能。</li>
<li><code>resource_action_separator</code>用来设置RESTful url中resource和action之间的分隔符。默认为"/"。</li>
<li><code>resource_path_names</code>用来设置一个RESTful action默认的名字的哈希。默认情况下，new action被命名为<code>new</code>而edit action被命名为<code>edit</code>。</li>
<li><code>request_forgery_protection_token</code>用来设置RequestForgery的参数名。调用<code>protect_from_forgery</code>会将它设为<code>:authenticity_token</code></li>
<li><code>optimise_named_routes</code>打开了一些生成路径表（routes table）的优化。它默认被设为<code>true</code></li>
<li><code>use_accept_header</code>用于设置确定response格式的规则。如果该值设为<code>true</code>（默认值），则<code>respond_to</code>方法和<code>Request#format</code>方法会根据Accept Header返回相应格式的response。弱该值设为<code>false</code>则request格式会单独由<code>params[:format]</code>来决定。如果没有<code>format</code>参数，则response的格式会根据request是否是一个Ajax request来决定返回HTML还是Javascript。</li>
<li><code>allow_forgery_protection</code>用于设置启用还是禁用CSRF保护。默认在测试模式下该值为<code>false</code>而在其他模式下为<code>true</code>。</li>
<li><code>relative_url_root</code>可以被用来告诉Rails你将会将应用部署到一个子目录。默认值为<code>ENV['RAILS_RELATIVE_URL_ROOT']</code></li>
<p>缓存功能代码将会增加两个额外的设置：</p>
<li><code>ActionController::Caching::Pages.page_cache_directory</code>用于设置Rails为你的Web服务器创建缓存页面的位置。默认值为<code>Rails.public_path</code>（通常该值被设为<code>RAILS_ROOT</code>"/public"+）。</li>
<li><code>ActionController::Caching::Pages.page_cache_extension</code>用于设置生成的缓存页面文件的扩展名（如果进来的requests已经带了扩展名则这里的扩展名会被忽略）。默认值为<code>.html</code>。</li>
<p>分发器（dispatcher）包含了这样一条配置</p>
<li><code>ActionController::Dispatcher.error_file_path</code>给定了Rails用来寻找出错文件如<code>404.html</code>的路径。默认值为<code>Rails.public_path</code>。</li>
<p>使用Active Record的session存储可以这样来配置</p>
<li><code>CGI::Session::ActiveRecordStore::Session.data_column_name</code>用于设置用来存储session数据的列名。默认值为'data'。</li>
</ul>
<h3>3.3 配置Action View</h3>
<p>Action View上只有不多的几个配置选项，从<code>ActionView:Base</code>的四个开始：</p>
<ul>
<li><code>debug_rjs</code>决定RJS response是否会被包装在try/catch块中，并alert()被捕捉的异常（并重新将其抛出）（译者注：即是否对rjs使用debug模式，使得rjs的异常在开发工程中会被alert显示出来）。默认值为<code>false</code>。</li>
<li><code>warn_cache_misses</code>是否在一个action的结果遇到view路径中缓存未命中时Rails会显示一个警告。默认值为<code>false</code>。</li>
<li><code>field_error_proc</code>提供了一个HTML生成器来显示来自于Active Record的错误。默认值为<code>Proc.new {|html_tag, instance| "#{html_tag}"}</code></li>
<li><code>default_form_builder</code>告诉Rails默认实用的表单构建器（form builder）。默认值为<code>ActionView::Helpers::FormBuilder</code>。</li>
<p>ERB Template handler提供了一个额外的选项</p>
<li><code>ActionView::TemplateHandlers::ERB.erb_trim_mode</code>提供了ERB使用的修剪模式（trim mode）。默认为'-'。查看<a href="http://www.ruby-doc.org/stdlib/libdoc/erb/rdoc/" target="_blank">ERB文档</a>获得更多信息</li>
</ul>
<h3>3.4 配置Action Mailer</h3>
<p><code>ActionMailer::Base</code>上由一系列可用的配置：</p>
<ul>
<li><code>template_root</code>提供了Action Mailer模版的根目录</li>
<li><code>logger</code>接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger，用来记录来自Action Mailer的日志信息。设为nil则禁用日志记录功能。</li>
<li><code>smtp_settings</code>用来为<code>smtp</code>邮件发送方式提供详细的配置信息。它接受一个哈希组成的选项，包括如下任意的选项：
<ul>
<li><code>:address</code>允许你使用一个远端的邮件服务器。请将它从默认的"localhost"改为你所用的邮件服务器。</li>
<li><code>:port</code>如果你使用的邮件服务器不在25端口上运行，请修改这个配置。</li>
<li><code>:domain</code>如果你需要指定一个HELO域名，请在这里指定。</li>
<li><code>:user_name</code>如果你的邮件服务器需要认证，请在这里设置用户名</li>
<li><code>:password</code>如果你的邮件服务器需要认证，请在这里设置密码</li>
<li><code>:authentication</code>如果你的邮件服务器需要人证，你需要在此指定认证的类型。它应该是<code>:plain</code>，<code>:login</code>，和<code>:cram_md3</code>三个符号其中之一。</li>
</ul>
</li>
<li><code>sendmail_settings</code>允许你对<code>sendmail</code>邮件发送方式进行详细的配置。它接受一个哈希组成的选项，包括如下任意的选项：
<ul>
<li><code>:location</code>—sendmail可执行文件的位置。默认为<code>/usr/sbin/sendmail</code>。</li>
<li><code>:arguments</code>—命令行参数。默认值为<code>-i -t</code></li>
</ul>
</li>
<li><code>raise_delivery_errors</code>设置如果邮件发送没能完成是否需要抛出一个错误。默认值为<code>true</code>。</li>
<li><code>delivery_method</code>设置邮件发送方式。可以使用的值有<code>:smtp</code>（默认值），<code>:sendmail</code>以及<code>:test</code></li>
<li><code>perform_deliveries</code>指定邮件是否要真得发送出去。默认值为<code>:true</code>，测试时可以方便地设为<code>false</code>。</li>
<li><code>default_charset</code>设定Action Mailer用于编码邮件主题和内容的字符集。默认为<code>utf-8</code></li>
<li><code>default_content_type</code>设置消息的主体所使用的默认的content type。默认值为<code>text/plain</code>。</li>
<li><code>default_mime_version</code>设置消息实用的默认的MIME版本。默认值为<code>1.0</code>。</li>
<li><code>default_implicit_parts_order</code>—当一个消息被隐式地构建（例如，邮件的多部分通过模版组装，而模版通过文件名设定了content type），这个变量控制多个部分的顺序。默认为<code>["text/html", "text/enriched", "text/plain"]</code></li>
<p>。数组中先出现的项在邮件客户端中有较高的优先级，并在mime编码消息的最后出现。
</ul>
<h3>3.5 配置Active Resource</h3>
<p><code>ActiveResource::Base</code>中有一个配置可以设置：<br />
<code>logger</code>接收一个符合Log4r或者Ruby1.8.x Logger类的接口的logger，用来从Active Resource中记录日志信息。设为nil时禁用日志功能。</p>
<h3>3.6 配置Active Support</h3>
<p>Active Support中有一些配置选项：</p>
<ul>
<li><code>ActiveSupport::BufferedLogger.silencer</code>设为<code>false</code>则禁用了对代码块的缄默日志（silence logging）功能（译者注：可以参看<a href="http://api.rubyonrails.com/classes/ActiveSupport/BufferedLogger.html#M001499">http://api.rubyonrails.com/classes/ActiveSupport/BufferedLogger.html#M001499</a>，缄默日志使得silence方法可以对指定的代码块屏蔽日志功能或者改变日志的level）。默认值为<code>true</code>。</li>
<li><code>ActiveSupport::Cache::Store.logger</code>设定了缓存存储操作所使用的logger。</li>
<li><code>ActiveSupport::Logger.silencer</code>设为<code>false</code>则禁用了对代码块的缄默日志（silence logging）功能。默认值为<code>true</code>。</li>
</ul>
<h3>配置 Active Model</h3>
<p>Active Model目前有一个单独的配置设置：</p>
<ul>
<li><code>ActiveModel::Errors.default_error_messages</code>是一个包含所有验证错误消息的数组。</li>
</ul>
<h2>使用初始化器</h2>
<p>在装载了框架以及任何gems和插件之后，Rails会开始装载初始化器（initializers）。一个初始化器是在你的应用中任何存储在<code>/config/initializers</code>中的ruby代码。你可以使用初始化器来存放哪些应该整个框架和插件装载后进行的配置设置。<br />
<br/></p>
<div style="background: YELLOW">如果你喜欢的话，你可以使用子目录来组织你的初始化器，因为Rails会渗入到initializers目录的整个文件目录层级中去。</div>
<p><br/></p>
<div style="background: SKYBLUE">如果你的初始化器有任何的顺序依赖关系，你可以通过命名来控制它们装载的顺序。例如，01_critical.rb会在02_normal.rb之前装载。</div>
<p><br/></p>
<h2>使用一个后初始化器（After-Initializer）</h2>
<p>后初始化器（如同你所猜想的）会在所有的初始化器装载之后运行。你可以通过在任何Rails配置文件中设立<code>config.after_intialize</code>来支持一个<code>after_initialize</code>代码块（或者一个这种代码块的数组）。</p>
<pre name="code" class="ruby">
config.after_initialize do
    SomeClass.init
end
</pre>
<div style="background: ORANGE">你应用的一部分，特别是观察者（observers）和路径（routing）在after_initialize代码块被调用时还没有建立好。</div>
<p><br/></p>
<h2>Rails环境设置</h2>
<p>Rails的一部分配置可以通过外部环境变量来配置。以下的环境变量会被Rails的不同部分识别出来。</p>
<ul>
<li><code>ENV['RAILS_ENV']</code>定义了Rails所运行在的环境（production，development，test等等）</li>
<li><code>ENV['RAILS_RELATIVE_URL_ROOT']</code>被路径代码用来在你部署你的应用到一个子目录时识别出URL。</li>
<li><code>ENV['RAILS_ASSET_ID']</code>会覆写默认的Rails生成的用户可下载资产的缓存失效的时间戳。</li>
<li><code>ENV['RAILS_CACHE_ID']</code>和<code>ENV['RAILS_APP_VERSION']</code>用来生成Rails缓存代码中的扩展的缓存键。这可以允许你对同一个应用有多个分开的缓存。</li>
<li><code>ENV['RAILS_GEM_VERSION]</code>在<code>RAILS_GEM_VERSION</code>没有在<code>environment.rb</code>文件中定义时，定义了使用的Rails gems的版本。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/13/configuring-rails-applications/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>functional tests中的form_authenticity_token</title>
		<link>http://www.xuwenhao.com/2009/02/09/form_authenticity_token-in-functional-tests/</link>
		<comments>http://www.xuwenhao.com/2009/02/09/form_authenticity_token-in-functional-tests/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 15:25:01 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=682</guid>
		<description><![CDATA[又是一个前一阵遇到的很tricky的问题。 Rails2.0中加入了form_authenticity_token来防止部分的cross-site的攻击，ActionView中默认的form_for标签会自动加入类似于 的代码，如果你自己使用form_tag来创建form的话，可以用类似于 &#60;input type="hidden" name="authenticity_token" value="&#60;%= "#{form_authenticity_token}" %&#62;" /&#62; 的代码来加入这个隐藏的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状态的判断代码，比如 &#60;input type="hidden" name="authenticity_token" value="&#60;%= "#{form_authenticity_token}" %&#62;" /&#62; 但是有位同学用了个更巧妙的hook的办法，在test_helper.rb中hook掉form_authenticity_token，如下 module ActionController [...]]]></description>
			<content:encoded><![CDATA[<p>又是一个前一阵遇到的很tricky的问题。</p>
<p>Rails2.0中加入了form_authenticity_token来防止部分的cross-site的攻击，ActionView中默认的form_for标签会自动加入类似于
<pre name="code" class="html">
<input type="hidden" name="authenticity_token" value="d4500add369b69aee5fca2c1955e4673c941b0d3" /></pre>
<p>的代码，如果你自己使用form_tag来创建form的话，可以用类似于</p>
<pre name="code" class="ruby">
&lt;input type="hidden" name="authenticity_token" value="&lt;%= "#{form_authenticity_token}" %&gt;" /&gt;
</pre>
<p>的代码来加入这个隐藏的form中的authenticity_token。</p>
<p>但是手工加入这个token在functional tests中会带来问题，因为functional tests中是把allow_forgery_protection关掉的<br />
可以在environments/test.rb中看到这样的配置</p>
<pre name="code" class="ruby">
config.action_controller.allow_forgery_protection    = false
</pre>
<p>但是authenticity现在是hardcode在代码中，所以跑functional tests通常会遇到这样的错误</p>
<pre name="code" class="ruby">
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).
</pre>
<p>一种<a href="http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/b7f0bda9209c71f6" target="_blank">解决办法</a>是在view中加入当前all_forgery_protection状态的判断代码，比如</p>
<pre name="code" class="ruby">
<% if  protect_against_forgery? %>
&lt;input type="hidden" name="authenticity_token" value="&lt;%= "#{form_authenticity_token}" %&gt;" /&gt;
<% end %>
</pre>
<p>但是<a href="http://pauldoerwald.ca/2008/4/23/form_authenticity_token-in-functional-tests" target="_blank">有位同学</a>用了个更巧妙的hook的办法，在test_helper.rb中hook掉form_authenticity_token，如下</p>
<pre name="code" class="ruby">
module ActionController
  module RequestForgeryProtection
    def form_authenticity_token
      return "form_authenticity_token OVERRIDE!"
    end
  end
end
</pre>
<p>我比较喜欢后一种啦。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/09/form_authenticity_token-in-functional-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在新macbook上安装Rails+MySQL</title>
		<link>http://www.xuwenhao.com/2009/02/09/install-rails-with-mysql-on-new-macboo/</link>
		<comments>http://www.xuwenhao.com/2009/02/09/install-rails-with-mysql-on-new-macboo/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 14:37:33 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Tech]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=672</guid>
		<description><![CDATA[嗯，嗯，嗯，这个问题前一阵来来回回折腾过不少时间，主要的问题在于 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 install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config]]></description>
			<content:encoded><![CDATA[<p>嗯，嗯，嗯，这个问题前一阵来来回回折腾过不少时间，主要的问题在于</p>
<ul>
<li>Macbook 466是64位的CPU</li>
<li>Leopard自带的Ruby是32位的版本</li>
<li>如果安装的MySQL是64位版本的，就需要自己编译个Ruby</li>
<li>要不你就像我这样还是装个32位的MySQL吧</li>
</ul>
<p>MySQL安装的注意事项</p>
<ul>
<li>建议安装Startup Item，这样就开机自启动了</li>
<li>如果装了Startup Item但是不想开机自启动，那就修改/etc/hostconfig，把MYSQLCOM=-YES-改成MYSQLCOM=-NO-</li>
<li>默认的encoding是latin1，所以要改一下配置文件，按下面这么办就行了</li>
</ul>
<pre name="code" class="ruby">
   $ 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 </pre>
<p>记得数据库创建要在改完配置重启mysqld之后，不然创建的数据库默认还是latin1的</p>
<p>然后就是gem安装mysql的驱动了，抛弃掉Rails自带的过时的ruby版本的驱动了</p>
<pre name="code" class="ruby">
sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
</pre>
<p>如果您装的是64位的Ruby和MySQL那么改一个参数吧</p>
<pre name="code" class="ruby">
sudo env ARCHFLAGS="-arch x86_64" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2009/02/09/install-rails-with-mysql-on-new-macboo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>奥妙的Rails</title>
		<link>http://www.xuwenhao.com/2008/11/27/interesting-rails/</link>
		<comments>http://www.xuwenhao.com/2008/11/27/interesting-rails/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 14:36:25 +0000</pubDate>
		<dc:creator>Stanley Xu</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Tech]]></category>

		<guid isPermaLink="false">http://www.xuwenhao.com/?p=619</guid>
		<description><![CDATA[发现这个东西的确写同样功能比起Java来，十分之一的代码都用不上。不过问题是……我要多花10倍的时间研究到底怎么把这十分之一的代码给写出来…… 所以结果其实也没节省时间。]]></description>
			<content:encoded><![CDATA[<p>发现这个东西的确写同样功能比起Java来，十分之一的代码都用不上。不过问题是……我要多花10倍的时间研究到底怎么把这十分之一的代码给写出来……</p>
<p>所以结果其实也没节省时间。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.xuwenhao.com/2008/11/27/interesting-rails/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

