<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ASCIIcasts - Full Episode Feed</title>
    <description>The latest episodes from ASCIIcasts</description>
    <link>http://asciicasts.com/</link>
    <pubDate>Mon, 08 Aug 2011 18:05:15 +0000</pubDate>
    <ttl>1440</ttl>
    <item>
      <title>AJAX&#30340;&#21382;&#21490;&#35760;&#24405;&#29366;&#24577;</title>
      <description>&lt;p&gt;&amp;#x5728;&amp;#x7B2C;240&amp;#x96C6; [ &lt;a href="http://railscasts.com/episodes/240-search-sort-paginate-with-ajax"&gt;&amp;#x89C2;&amp;#x770B;&lt;/a&gt; &amp;#xFF0C; &lt;a href="http://asciicasts.com/episodes/240-search-sort-paginate-with-ajax"&gt;&amp;#x9605;&amp;#x8BFB;&lt;/a&gt; ]&amp;#x6211;&amp;#x4EEC;&amp;#x5411;&amp;#x4F60;&amp;#x5C55;&amp;#x793A;&amp;#x4E86;&amp;#x5982;&amp;#x4F55;&amp;#x4F7F;&amp;#x7528;AJAX&amp;#x6765;&amp;#x6DFB;&amp;#x52A0;&amp;#x6392;&amp;#x5E8F;&amp;#xFF0C;&amp;#x5206;&amp;#x9875;&amp;#x548C;&amp;#x641C;&amp;#x7D22;&amp;#x5230;&amp;#x4EA7;&amp;#x54C1;&amp;#x8868;&amp;#x3002;&amp;#x8FD9;&amp;#x6837;&amp;#x4F7F;&amp;#x7528;AJAX&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#x4E4B;&amp;#x4E00;&amp;#x662F;&amp;#xFF0C;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x8FDB;&amp;#x884C;&amp;#x6392;&amp;#x5E8F;&amp;#x6216;&amp;#x7B5B;&amp;#x9009;&amp;#x8868;&amp;#x683C;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x8BE5;&amp;#x7F51;&amp;#x9875;&amp;#x7684;&amp;#x7F51;&amp;#x5740;&amp;#x4E0D;&amp;#x53D8;&amp;#x3002;&amp;#x8FD9;&amp;#x610F;&amp;#x5473;&amp;#x7740;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0D;&amp;#x80FD;&amp;#x4F7F;&amp;#x7528;&amp;#x8FD4;&amp;#x56DE;&amp;#x6309;&amp;#x94AE;&amp;#x64A4;&amp;#x9500;&amp;#x6211;&amp;#x4EEC;&amp;#x5BF9;&amp;#x8868;&amp;#x683C;&amp;#x7684;&amp;#x4FEE;&amp;#x6539;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4E5F;&amp;#x4E0D;&amp;#x80FD;&amp;#x628A;&amp;#x6392;&amp;#x5E8F;&amp;#x6216;&amp;#x7B5B;&amp;#x9009;&amp;#x540E;&amp;#x7684;&amp;#x9875;&amp;#x9762;&amp;#x5B58;&amp;#x4E3A;&amp;#x4E66;&amp;#x7B7E;&amp;#xFF0C;&amp;#x4EE5;&amp;#x4FBF;&amp;#x6211;&amp;#x4EEC;&amp;#x56DE;&amp;#x6765;&amp;#x540E;&amp;#x5F97;&amp;#x5230;&amp;#x540C;&amp;#x6837;&amp;#x7684;&amp;#x7ED3;&amp;#x679C;&amp;#x3002;&lt;/p&gt; &lt;div class="imageWrapper"&gt; &lt;img src="/system/photos/536/original/E246I01.png" width="800" height="374" alt="&amp;#x202A;&amp;#x53EF;&amp;#x4EE5;&amp;#x6392;&amp;#x5E8F;&amp;#x548C;&amp;#x641C;&amp;#x7D22;&amp;#x7684;&amp;#x4EA7;&amp;#x54C1;&amp;#x8868;&amp;#x3002;&amp;#x202C;"/&gt; &lt;/div&gt; &lt;p&gt;&amp;#x8FD9;&amp;#x662F;&amp;#x628A;AJAX&amp;#x529F;&amp;#x80FD;&amp;#x6DFB;&amp;#x52A0;&amp;#x5230;&amp;#x4E00;&amp;#x4E2A;&amp;#x7AD9;&amp;#x70B9;&amp;#x65F6;&amp;#x4E00;&amp;#x4E2A;&amp;#x5E38;&amp;#x89C1;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x80FD;&amp;#x627E;&amp;#x5230;&amp;#x4E00;&amp;#x4E2A;&amp;#x89E3;&amp;#x51B3;&amp;#x529E;&amp;#x6CD5;&amp;#x8FD9;&amp;#x5C06;&amp;#x4F1A;&amp;#x5F88;&amp;#x6709;&amp;#x7528;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x5728;&amp;#x8FD9;&amp;#x96C6;&amp;#x4E2D;&amp;#x544A;&amp;#x8BC9;&amp;#x4F60;&amp;#x600E;&amp;#x4E48;&amp;#x505A;&amp;#x3002;&lt;/p&gt; &lt;h3&gt;&amp;#x4ECB;&amp;#x7ECD;history.pushState&amp;#x65B9;&amp;#x6CD5;&lt;/h3&gt; &lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x6211;&amp;#x4EEC;&amp;#x66FE;&amp;#x7ECF;&amp;#x5728;&amp;#x7B2C;175 [ &lt;a href="http://railscasts.com/episodes/175-ajax-history-and-bookmarks"&gt;&amp;#x89C2;&amp;#x770B;&lt;/a&gt; &amp;#xFF0C; &lt;a href="http://asciicasts.com/episodes/175-ajax-history-and-bookmarks"&gt;&amp;#x9605;&amp;#x8BFB;&lt;/a&gt; ]&amp;#x96C6;&amp;#x4E2D;&amp;#x6D89;&amp;#x53CA;&amp;#x8FC7;&amp;#x8FD9;&amp;#x4E2A;&amp;#x8BDD;&amp;#x9898;&amp;#xFF0C;&amp;#x5728;&amp;#x90A3;&amp;#x4E00;&amp;#x96C6;&amp;#x4E2D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x901A;&amp;#x8FC7;&amp;#x6539;&amp;#x53D8;URL&amp;#x5728;&amp;#x4E00;&amp;#x4E2A;&amp;#x542F;&amp;#x7528;AJAX&amp;#x7684;&amp;#x7F51;&amp;#x7AD9;&amp;#x52A0;&amp;#x5165;&amp;#x4E66;&amp;#x7B7E;&amp;#x548C;&amp;#x5386;&amp;#x53F2;&amp;#x8BB0;&amp;#x5F55;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&amp;#x5728;&amp;#x90A3;&amp;#x96C6;&amp;#x4E2D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5206;&amp;#x9875;&amp;#x540E;&amp;#x5C31;&amp;#x5728;URL&amp;#x540E;&amp;#x52A0;&amp;#x5165;&amp;#x4E86;&amp;#x4E00;&amp;#x4E2A;&amp;#x951A;&amp;#x70B9;&amp;#xFF0C;&amp;#x6BD4;&amp;#x5982;&amp;#x8BF4;&amp;#xFF0C;&amp;#x7B2C;3&amp;#x9875;&amp;#xFF0C;&amp;#x7F51;&amp;#x5740;&amp;#x662F;&lt;code&gt;http://localhost:3000/#page=3&lt;/code&gt; &amp;#x3002;&amp;#x8FD9;&amp;#x4F7F;&amp;#x6211;&amp;#x4EEC;&amp;#x80FD;&amp;#x591F;&amp;#x4E66;&amp;#x7B7E;&amp;#x9875;&amp;#xFF0C;&amp;#x4F7F;&amp;#x540E;&amp;#x9000;&amp;#x6309;&amp;#x94AE;&amp;#x6B63;&amp;#x5E38;&amp;#x5DE5;&amp;#x4F5C;&amp;#x3002;&amp;#x8FD9;&amp;#x79CD;&amp;#x65B9;&amp;#x6CD5;&amp;#x6548;&amp;#x679C;&amp;#x5F88;&amp;#x597D;&amp;#xFF0C;&amp;#x4F46;&amp;#x5F88;&amp;#x5FEB;&amp;#x5C31;&amp;#x53D8;&amp;#x5F97;&amp;#x66F4;&amp;#x590D;&amp;#x6742;&amp;#x7684;&amp;#x60C5;&amp;#x51B5;&amp;#x590D;&amp;#x6742;&amp;#xFF0C;&amp;#x6BD4;&amp;#x5982;&amp;#x50CF;&amp;#x73B0;&amp;#x5728;&amp;#x9700;&amp;#x8981;&amp;#x5728;&amp;#x6392;&amp;#x5E8F;&amp;#x548C;&amp;#x641C;&amp;#x7D22;&amp;#x7684;&amp;#x540C;&amp;#x65F6;&amp;#x8FDB;&amp;#x884C;&amp;#x5206;&amp;#x9875;&amp;#x3002;&lt;/p&gt; &lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x5728;&amp;#x8FD9;&amp;#x91CC;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;&amp;#x6280;&amp;#x672F;&amp;#x4E5F;&amp;#x88AB;&amp;#x5E94;&amp;#x7528;&amp;#x5728;GitHub&amp;#x7684;&amp;#x6587;&amp;#x4EF6;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x4E0A;&amp;#x3002;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x4E2D;&amp;#x70B9;&amp;#x51FB;&amp;#x4E86;&amp;#x4E00;&amp;#x4E2A;GitHub&amp;#x7684;&amp;#x4E00;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x5939;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E2A;&amp;#x9875;&amp;#x9762;&amp;#x5C31;&amp;#x901A;&amp;#x8FC7;AJAX&amp;#x5237;&amp;#x65B0;&amp;#x4E86;&amp;#xFF0C;&amp;#x5E76;&amp;#x4E14;&amp;#x4E0D;&amp;#x4EC5;&amp;#x4EC5;&amp;#x662F;&amp;#x951A;&amp;#x70B9;&amp;#x6574;&amp;#x4E2A;URL&amp;#x4E5F;&amp;#x88AB;JavaScript&amp;#x66F4;&amp;#x65B0;&amp;#x4E86;&amp;#x3002;&amp;#x8FD9;&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;&amp;#x66F4;&amp;#x4F18;&amp;#x96C5;&amp;#x7684;&amp;#x89E3;&amp;#x51B3;&amp;#x65B9;&amp;#x6848;&amp;#xFF0C;&amp;#x8FD9;&amp;#x610F;&amp;#x5473;&amp;#x7740;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#x6216;&amp;#x5B58;&amp;#x4E3A;&amp;#x4E66;&amp;#x7B7E;&amp;#x3002;&amp;#x53E6;&amp;#x5916;&amp;#xFF0C;&amp;#x8BE5;&amp;#x9875;&amp;#x9762;&amp;#x88AB;&amp;#x6DFB;&amp;#x52A0;&amp;#x5230;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x7684;&amp;#x5386;&amp;#x53F2;&amp;#x4E2D;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x540E;&amp;#x9000;&amp;#x6309;&amp;#x94AE;&amp;#x5C31;&amp;#x50CF;&amp;#x6211;&amp;#x4EEC;&amp;#x671F;&amp;#x5F85;&amp;#x7684;&amp;#x90A3;&amp;#x6837;&amp;#x5DE5;&amp;#x4F5C;&amp;#x4E86;&amp;#x3002;&lt;/p&gt; &lt;p&gt;&lt;a href="https://github.com/blog/760-the-tree-slider"&gt;GitHub&amp;#x5728;&amp;#x535A;&amp;#x5BA2;&amp;#x4E0A;&amp;#x8BB2;&amp;#x8FC7;&amp;#x8FD9;&amp;#x4E2A;&amp;#x65B9;&amp;#x6848;&lt;/a&gt;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E2A;blog&amp;#x540E;&amp;#x5F88;&amp;#x503C;&amp;#x5F97;&amp;#x4E00;&amp;#x8BFB;&amp;#xFF0C;&amp;#x770B;&amp;#x770B;&amp;#x8FD9;&amp;#x662F;&amp;#x5982;&amp;#x4F55;&amp;#x5B9E;&amp;#x73B0;&amp;#x7684;&amp;#x3002;&amp;#x8981;&amp;#x770B;&amp;#x5230;&amp;#x5B83;&amp;#x5DE5;&amp;#x4F5C;&amp;#x4F60;&amp;#x9700;&amp;#x8981;&amp;#x6700;&amp;#x65B0;&amp;#x7248;&amp;#x7684;Safari&amp;#xFF0C;Chrome&amp;#x6216;Firefox&amp;#xFF0C;&amp;#x4F46;&amp;#x5B83;&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;&amp;#x7EDD;&amp;#x5BF9;&amp;#x503C;&amp;#x5F97;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;&amp;#x6280;&amp;#x672F;&amp;#x3002;&amp;#x662F;&lt;code&gt;history&lt;/code&gt;&amp;#x5BF9;&amp;#x8C61;&amp;#x7684;&lt;code&gt;pushState&lt;/code&gt;&amp;#x548C;&lt;code&gt;replaceState&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x548C;&lt;code&gt;popstate&lt;/code&gt;&amp;#x4E8B;&amp;#x4EF6;&amp;#x8BA9;&amp;#x8FD9;&amp;#x4E2A;&amp;rdquo;&amp;#x795E;&amp;#x5947;&amp;rdquo;&amp;#x5DE5;&amp;#x4F5C;&amp;#x7684;&amp;#x3002;&amp;#x5728;GitHub&amp;#x7684;&amp;#x535A;&amp;#x5BA2;&amp;#x4E0A;&amp;#x6709;&amp;#x4E9B;&amp;#x6709;&amp;#x7528;&amp;#x7684;&amp;#x94FE;&amp;#x63A5;&amp;#xFF0C;&amp;#x4ECE;&amp;#x90A3;&amp;#x4F60;&amp;#x53EF;&amp;#x4EE5;&amp;#x5F97;&amp;#x5230;&amp;#x66F4;&amp;#x7EC6;&amp;#x8282;&amp;#x7684;&amp;#x5173;&amp;#x4E8E;&amp;#x8FD9;&amp;#x4E2A;&amp;#x51FD;&amp;#x6570;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;&amp;#x6F14;&amp;#x793A;&amp;#x3002;&lt;/p&gt; &lt;p&gt;&amp;#x8BA9;&amp;#x6211;&amp;#x4EEC;&amp;#x770B;&amp;#x770B;&amp;#x628A;&amp;#x6574;&amp;#x4E2A;&amp;#x529F;&amp;#x80FD;&amp;#x52A0;&amp;#x5230;&amp;#x6211;&amp;#x4EEC;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x8D2D;&amp;#x7269;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x662F;&amp;#x591A;&amp;#x4E48;&amp;#x7684;&amp;#x7B80;&amp;#x5355;&amp;#xFF0C;&amp;#x4EE5;&amp;#x4FBF;&amp;#x5B83;&amp;#x80FD;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x6392;&amp;#x5E8F;&amp;#xFF0C;&amp;#x641C;&amp;#x7D22;&amp;#x548C;&amp;#x5206;&amp;#x9875;&amp;#x4EA7;&amp;#x54C1;&amp;#x8868;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x8D77;&amp;#x4F5C;&amp;#x7528;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x6DFB;&amp;#x52A0;&amp;#x5230;&amp;#x539F;&amp;#x6765;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x7684;JavaScript&amp;#x7A0B;&amp;#x5E8F;&amp;#x662F;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#xFF1A;&lt;/p&gt; &lt;p class="codeFilePath"&gt;/public/javascripts/application.js&lt;/p&gt; &lt;pre class="javascript"&gt;$(function () {
$(&amp;#39;#products th a, #products .pagination a&amp;#39;).live(&amp;#39;click&amp;#39;,
  function () {
    $.getScript(this.href);
    return false;
  }
);

$(&amp;#39;#products_search input&amp;#39;).keyup(function () {
  $.get($(&amp;#39;#products_search&amp;#39;).attr(&amp;#39;action&amp;#39;), $(&amp;#39;#products_search&amp;#39;).serialize(), null, &amp;#39;script&amp;#39;);
  return false;
});
})
&lt;/pre&gt; &lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x4E2D;&amp;#x5305;&amp;#x542B;&amp;#x4F60;&amp;#x89C9;&amp;#x5F97;&amp;#x4E0D;&amp;#x719F;&amp;#x6089;&amp;#x7684;&amp;#x4E1C;&amp;#x897F;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#x5B83;&amp;#x503C;&amp;#x5F97;&amp;#x53BB;240&amp;#x96C6;&amp;#x67E5;&amp;#x770B;&amp;#x7684;&amp;#x66F4;&amp;#x591A;&amp;#x7EC6;&amp;#x8282;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x4F7F;&amp;#x7528;jQuery&amp;#x5728;&amp;#x8FD9;&amp;#x91CC;&amp;#xFF0C;&amp;#x4F46;&amp;#x56E0;&amp;#x4E3A;&amp;#x7528;&lt;code&gt;pushState&lt;/code&gt;&amp;#x548C;&lt;code&gt;replaceState&lt;/code&gt;&amp;#xFF0C;&amp;#x8FD9;&amp;#x79CD;&amp;#x6280;&amp;#x672F;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x548C;Prototype&amp;#x4F7F;&amp;#x7528;&amp;#x3002;&lt;/p&gt; &lt;p&gt;&amp;#x4EE3;&amp;#x7801;&amp;#x7684;&amp;#x7B2C;&amp;#x4E00;&amp;#x90E8;&amp;#x5206;&amp;#x7528;&amp;#x4E8E;&amp;#x5904;&amp;#x7406;&amp;#x6392;&amp;#x5E8F;&amp;#x548C;&amp;#x5206;&amp;#x9875;&amp;#x7684;AJAX&amp;#x529F;&amp;#x80FD;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E2A;&amp;#x8C03;&amp;#x7528;&lt;code&gt;history.pushState&lt;/code&gt;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x5F53;&amp;#x4E00;&amp;#x4E2A;&amp;#x5206;&amp;#x9875;&amp;#x6216;&amp;#x6392;&amp;#x5E8F;&amp;#x7684;&amp;#x94FE;&amp;#x63A5;&amp;#x88AB;&amp;#x70B9;&amp;#x51FB;&amp;#x540E;&amp;#xFF0C;URL&amp;#x5C31;&amp;#x88AB;&amp;#x6DFB;&amp;#x52A0;&amp;#x5230;&amp;#x5386;&amp;#x53F2;&amp;#x8BB0;&amp;#x5F55;&amp;#x91CC;&amp;#x4E86;&amp;#x3002;&lt;/p&gt; &lt;p&gt;&amp;#x6709;&amp;#x4E00;&amp;#x4E9B;&lt;a href="https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history#Adding_and_modifying_history_entries"&gt;&amp;#x6709;&amp;#x7528;&amp;#x7684;&amp;#x5173;&amp;#x4E8E;&lt;code&gt;pushState&lt;/code&gt;&lt;/a&gt;&amp;#x6587;&amp;#x6863;&amp;#x5728;Mozilla&amp;#x7684;&amp;#x5F00;&amp;#x53D1;&amp;#x8005;&amp;#x7F51;&amp;#x4E0A;&amp;#xFF0C;&amp;#x8868;&amp;#x660E;&amp;#x5B83;&amp;#x6709;&amp;#x4E09;&amp;#x4E2A;&amp;#x53C2;&amp;#x6570;&amp;#x3002;&amp;#x7B2C;&amp;#x4E00;&amp;#x4E2A;&amp;#x53C2;&amp;#x6570;&amp;#x662F;&amp;#x72B6;&amp;#x6001;&amp;#x5BF9;&amp;#x8C61;&amp;#xFF0C;&amp;#x5B83;&amp;#x53EF;&amp;#x4EE5;&amp;#x5C06;&amp;#x4EFB;&amp;#x4F55;&amp;#x5BF9;&amp;#x8C61;&amp;#xFF0C;&amp;#x4ED6;&amp;#x4F1A;&amp;#x5F53;popState&amp;#x4E8B;&amp;#x4EF6;&amp;#x88AB;&amp;#x89E6;&amp;#x53D1;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x8FD4;&amp;#x56DE;&amp;#x56DE;&amp;#x6765;&amp;#x3002;&amp;#x7B2C;&amp;#x4E8C;&amp;#x4E2A;&amp;#x53C2;&amp;#x6570;&amp;#x662F;&amp;#x6807;&amp;#x9898;&amp;#xFF0C;&amp;#x800C;&amp;#x7B2C;&amp;#x4E09;&amp;#x4E2A;&amp;#x662F;URL&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x77E5;&amp;#x9053;&amp;#x8FD9;&amp;#x4E9B;&amp;#x540E;&amp;#xFF0C;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x6DFB;&amp;#x52A0;&lt;code&gt;pushState&lt;/code&gt;&amp;#x7684;&amp;#x8C03;&amp;#x7528;&amp;#x4E86;&amp;#x3002;&lt;/p&gt; &lt;p class="codeFilePath"&gt;/public/javascripts/application.js&lt;/p&gt; &lt;pre class="javascript"&gt;$(&amp;#39;#products th a, #products .pagination a&amp;#39;).live(&amp;#39;click&amp;#39;, 
function () {
  $.getScript(this.href);
  history.pushState(null, &amp;quot;&amp;quot;, this.href);
  return false;
});
&lt;/pre&gt; &lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5E76;&amp;#x4E0D;&amp;#x9700;&amp;#x8981;&amp;#x5B58;&amp;#x50A8;&amp;#x4EFB;&amp;#x4F55;&amp;#x72B6;&amp;#x6001;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x8FD9;&amp;#x91CC;&amp;#x4F20;&amp;#x9012;&lt;code&gt;null&lt;/code&gt;&amp;#x4F5C;&amp;#x4E3A;&amp;#x7B2C;&amp;#x4E00;&amp;#x4E2A;&amp;#x53C2;&amp;#x6570;&amp;#x3002;&amp;#x540C;&amp;#x6837;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5E76;&amp;#x4E0D;&amp;#x9700;&amp;#x8981;&amp;#x4E00;&amp;#x4E2A;&amp;#x6807;&amp;#x9898;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#x6211;&amp;#x4EEC;&amp;#x4F20;&amp;#x9012;&amp;#x4E00;&amp;#x4E2A;&amp;#x7A7A;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x5230;&amp;#x7B2C;&amp;#x4E8C;&amp;#x4E2A;&amp;#x53C2;&amp;#x6570;&amp;#x3002;&amp;#x5BF9;&amp;#x4E8E;URL&amp;#x6211;&amp;#x4EEC;&amp;#x4F20;&amp;#x9012;&amp;#x4E86;&amp;#x5F53;&amp;#x524D;&amp;#x70B9;&amp;#x51FB;&amp;#x7684;&amp;#x94FE;&amp;#x63A5;&lt;code&gt;this.href&lt;/code&gt;&amp;#x3002;&lt;/p&gt; &lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x73B0;&amp;#x5728;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x70B9;&amp;#x51FB;AJAX&amp;#x6392;&amp;#x5E8F;&amp;#x6216;&amp;#x5206;&amp;#x9875;&amp;#x94FE;&amp;#x63A5;&amp;#x7684;&amp;#x540E;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E2A;&amp;#x8868;&amp;#x683C;&amp;#x4F1A;&amp;#x5728;&amp;#x6CA1;&amp;#x6709;&amp;#x91CD;&amp;#x65B0;&amp;#x52A0;&amp;#x8F7D;&amp;#x9875;&amp;#x9762;&amp;#x7684;&amp;#x60C5;&amp;#x51B5;&amp;#x4E0B;&amp;#x66F4;&amp;#x65B0;&amp;#xFF0C;&amp;#x4F46;&amp;#x73B0;&amp;#x5728;&amp;#x6BCF;&amp;#x6B21;&amp;#x6211;&amp;#x4EEC;&amp;#x70B9;&amp;#x51FB;&amp;#x4E00;&amp;#x4E2A;&amp;#x94FE;&amp;#x63A5;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x5F53;&amp;#x524D;&amp;#x5728;&amp;#x5730;&amp;#x5740;&amp;#x680F;&amp;#x4E0A;&amp;#x7684;URL&amp;#x4F1A;&amp;#x53D8;&amp;#x6210;&amp;#x6211;&amp;#x4EEC;&amp;#x4F20;&amp;#x5165;&lt;code&gt;pushState&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;URL&amp;#xFF0C;&amp;#x540C;&amp;#x65F6;&amp;#x8FD9;&amp;#x4E2A;URL&amp;#x4F1A;&amp;#x88AB;&amp;#x6DFB;&amp;#x52A0;&amp;#x5230;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x7684;&amp;#x5386;&amp;#x53F2;&amp;#x8BB0;&amp;#x5F55;&amp;#x4E2D;&amp;#x3002;&lt;/p&gt; &lt;div class="imageWrapper"&gt; &lt;img src="/system/photos/537/original/E246I02.png" width="801" height="474" alt="&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x4FEE;&amp;#x6539;&amp;#x6392;&amp;#x5E8F;&amp;#x5217;&amp;#xFF0C;URL&amp;#x5C31;&amp;#x4F1A;&amp;#x6539;&amp;#x53D8;&amp;#x3002;"/&gt; &lt;/div&gt; &lt;p&gt;&amp;#x6240;&amp;#x4EE5;&amp;#xFF0C;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x628A;&amp;#x6392;&amp;#x5E8F;&amp;#x548C;&amp;#x5206;&amp;#x9875;&amp;#x540E;&amp;#x7684;&amp;#x8868;&amp;#x683C;&amp;#x5B58;&amp;#x4E3A;&amp;#x4E66;&amp;#x7B7E;&amp;#xFF0C;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x56DE;&amp;#x6765;&amp;#xFF0C;&amp;#x6216;&amp;#x91CD;&amp;#x65B0;&amp;#x8F7D;&amp;#x5165;&amp;#x8FD9;&amp;#x4E2A;&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x5373;&amp;#x4F7F;&amp;#x9875;&amp;#x9762;&amp;#x88AB;&amp;#x901A;&amp;#x8FC7;AJAX&amp;#x52A8;&amp;#x6001;&amp;#x66F4;&amp;#x65B0;&amp;#xFF0C;&amp;#x5206;&amp;#x9875;&amp;#x548C;&amp;#x6392;&amp;#x5E8F;&amp;#x662F;&amp;#x53EF;&amp;#x4EE5;&amp;#x56DE;&amp;#x590D;&amp;#x7684;&amp;#x3002;&amp;#x4F46;&amp;#x662F;&amp;#x540E;&amp;#x9000;&amp;#x6309;&amp;#x94AE;&amp;#x8FD8;&amp;#x4E0D;&amp;#x4F1A;&amp;#x50CF;&amp;#x6211;&amp;#x4EEC;&amp;#x671F;&amp;#x5F85;&amp;#x7684;&amp;#x90A3;&amp;#x6837;&amp;#x5DE5;&amp;#x4F5C;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD8;&amp;#x6CA1;&amp;#x6709;&amp;#x76D1;&amp;#x542C;&lt;code&gt;popstate&lt;/code&gt;&amp;#x4E8B;&amp;#x4EF6;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x5728;&lt;code&gt;popstate&lt;/code&gt;&amp;#x4E8B;&amp;#x4EF6;&amp;#x89E6;&amp;#x53D1;&amp;#x540E;&amp;#x89E6;&amp;#x53D1;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B9;&amp;#x6CD5;&amp;#x6765;&amp;#x89E3;&amp;#x51B3;&amp;#x8FD9;&amp;#x4E2A;&amp;#x95EE;&amp;#x9898;&lt;/p&gt; &lt;p class="codeFilePath"&gt;/public/javascripts/application.js&lt;/p&gt; &lt;pre class="javascript"&gt;$(function () {
// Other functions omitted.
$(window).bind(&amp;quot;popstate&amp;quot;, function () {
  $.getScript(location.href);
});
})
&lt;/pre&gt; &lt;p&gt;&amp;#x5728;&lt;code&gt;popstate&lt;/code&gt;&amp;#x4E8B;&amp;#x4EF6;&amp;#x89E6;&amp;#x53D1;&amp;#x65F6;&amp;#xFF0C;URL&amp;#x5DF2;&amp;#x7ECF;&amp;#x6539;&amp;#x56DE;&amp;#x4EE5;&amp;#x5386;&amp;#x53F2;&amp;#x8BB0;&amp;#x5F55;&amp;#x4E2D;&amp;#x7684;&amp;#x524D;&amp;#x4E00;&amp;#x4E2A;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x8C03;&amp;#x7528;&lt;code&gt;$.getScript&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x5E76;&amp;#x4F20;&amp;#x5165;URL&amp;#x6765;&amp;#x66F4;&amp;#x65B0;&amp;#x4EA7;&amp;#x54C1;&amp;#x8868;&amp;#x683C;&amp;#x3002;&lt;/p&gt; &lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x73B0;&amp;#x5728;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#x5E76;&amp;#x5206;&amp;#x9875;&amp;#x548C;&amp;#x6392;&amp;#x5E8F;&amp;#x51E0;&amp;#x6B21;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x53D1;&amp;#x73B0;&amp;#x56DE;&amp;#x9000;&amp;#x6309;&amp;#x94AE;&amp;#x5DF2;&amp;#x7ECF;&amp;#x5DE5;&amp;#x505A;&amp;#x4E86;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x6240;&amp;#x505A;&amp;#x7684;&amp;#x66F4;&amp;#x6539;&amp;#x4E2D;&amp;#x5BFC;&amp;#x822A;&amp;#x56DE;&amp;#x6765;&amp;#x3002;&lt;/p&gt; &lt;h3&gt;&amp;#x641C;&amp;#x7D22;&lt;/h3&gt; &lt;p&gt;&amp;#x4E0B;&amp;#x9762;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x770B;&amp;#x4E00;&amp;#x4E0B;&amp;#x641C;&amp;#x7D22;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x73B0;&amp;#x5728;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x4E2D;&amp;#x5BF9;&amp;#x4EA7;&amp;#x54C1;&amp;#x641C;&amp;#x7D22;&amp;#x65F6;&amp;#xFF0C;&amp;#x5B83;&amp;#x4F1A;&amp;#x8FC7;&amp;#x6EE4;&amp;#x7684;&amp;#x7ED3;&amp;#x679C;&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;URL&amp;#x4E0D;&amp;#x4F1A;&amp;#x6539;&amp;#x53D8;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#x5982;&amp;#x679C;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x641C;&amp;#x7D22;&amp;#x540E;&amp;#x628A;&amp;#x5F53;&amp;#x524D;&amp;#x9875;&amp;#x5B58;&amp;#x4E3A;&amp;#x4E66;&amp;#x7B7E;&amp;#x6216;&amp;#x5237;&amp;#x65B0;&amp;#x540E;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x5931;&amp;#x53BB;&amp;#x4E86;&amp;#x8FD9;&amp;#x4E2A;&amp;#x641C;&amp;#x7D22;&amp;#x9875;&amp;#x9762;&amp;#x3002;&lt;/p&gt; &lt;div class="imageWrapper"&gt; &lt;img src="/system/photos/538/original/E246I03.png" width="801" height="474" alt="&amp;#x202A;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x91CD;&amp;#x65B0;&amp;#x52A0;&amp;#x8F7D;&amp;#x9875;&amp;#x9762;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x641C;&amp;#x7D22;&amp;#x5C31;&amp;#x4E22;&amp;#x5931;&amp;#x4E86;&amp;#x3002;&amp;#x202C;"/&gt; &lt;/div&gt; &lt;p&gt;&amp;#x7528;AJAX&amp;#x641C;&amp;#x7D22;&amp;#x7684;JavaScript&amp;#x662F;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#xFF1A;&lt;/p&gt; &lt;p class="codeFilePath"&gt;/public/javascripts/application.js&lt;/p&gt; &lt;pre class="javascript"&gt;$(function () {
// Other functions omitted.
$(&amp;#39;#products_search input&amp;#39;).keyup(function () {
  $.get($(&amp;#39;#products_search&amp;#39;).attr(&amp;#39;action&amp;#39;), $(&amp;#39;#products_search&amp;#39;).serialize(), null, &amp;#39;script&amp;#39;);
  return false;
});
})
&lt;/pre&gt; &lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x5728;&amp;#x8FD9;&amp;#x91CC;&amp;#x7528;&amp;#x548C;&amp;#x6211;&amp;#x4EEC;&amp;#x66F4;&amp;#x6539;&amp;#x6392;&amp;#x5E8F;&amp;#x90E8;&amp;#x5206;&amp;#x4EE3;&amp;#x7801;&amp;#x540C;&amp;#x6837;&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;pushState&lt;/code&gt;&amp;#x3002;&lt;/p&gt; &lt;p class="codeFilePath"&gt;/public/javascripts/application.js&lt;/p&gt; &lt;pre class="javascript"&gt;$(function () {
// Other functions omitted.
$(&amp;#39;#products_search input&amp;#39;).keyup(function () {
  var action = $(&amp;#39;#products_search&amp;#39;).attr(&amp;#39;action&amp;#39;);
  var formData = $(&amp;#39;#products_search&amp;#39;).serialize();
  $.get(action, formData, null, &amp;#39;script&amp;#39;);
  history.pushState(null, &amp;quot;&amp;quot;, action + &amp;quot;?&amp;quot; + formData);    return false;
}); 
})
&lt;/pre&gt; &lt;p&gt;&lt;code&gt;pushState&lt;/code&gt;&amp;#x8BB0;&amp;#x5F55;&amp;#x7684;URL&amp;#x662F;&amp;#x628A;&amp;#x4E00;&amp;#x4E2A;&amp;#x7EC4;&amp;#x5408;&amp;#x5F62;&amp;#x5F0F;&amp;#x641C;&amp;#x7D22;&amp;#x8868;&amp;#x5355;&amp;#x7684;&lt;code&gt;action&lt;/code&gt;&amp;#x548C;&amp;#x5E8F;&amp;#x5217;&amp;#x5316;&amp;#x540E;&amp;#x8868;&amp;#x5355;&amp;#x6570;&amp;#x636E;&amp;#x7528;&amp;#x95EE;&amp;#x53F7;&amp;#x8FDE;&amp;#x63A5;&amp;#x8D77;&amp;#x6765;&amp;#x540E;&amp;#x7684;&amp;#x4E00;&amp;#x4E2A;&amp;#x6709;&amp;#x6548;&amp;#x7684;&amp;#x7F51;&amp;#x5740;&amp;#x3002;&lt;/p&gt; &lt;p&gt;&amp;#x202A;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x5C31;&amp;#x770B;&amp;#x5230;&amp;#x6BCF;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x641C;&amp;#x7D22;&amp;#x6846;&amp;#x91CC;&amp;#x952E;&amp;#x5165;&amp;#x65F6;URL&amp;#x90FD;&amp;#x4F1A;&amp;#x6539;&amp;#x53D8;&amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x7136;&amp;#x800C;&amp;#x6211;&amp;#x4EEC;&amp;#x6309;&amp;#x8FD4;&amp;#x56DE;&amp;#x952E;&amp;#xFF0C;&amp;#x53D1;&amp;#x73B0;&amp;#x5386;&amp;#x53F2;&amp;#x9875;&amp;#x9762;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x641C;&amp;#x7D22;&amp;#x6846;&amp;#x91CC;&amp;#x6BCF;&amp;#x6B21;&amp;#x8F93;&amp;#x5165;&amp;#x7684;&amp;#x5B57;&amp;#x6BCD;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x662F;&amp;#x4E0D;&amp;#x4E0D;&amp;#x7406;&amp;#x60F3;&amp;#x7684;&amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x8FD9;&amp;#x662F;&amp;#x56E0;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x662F;&amp;#x5728;&amp;#x6BCF;&amp;#x4E00;&amp;#x4E2A;&amp;#x952E;&amp;#x88AB;&amp;#x6309;&amp;#x4E0B;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x8C03;&amp;#x7528;&amp;#x7684;&lt;code&gt;pushState&lt;/code&gt;&amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x5E78;&amp;#x8FD0;&amp;#x7684;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x80FD;&amp;#x591F;&amp;#x5F88;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x505A;&amp;#x5230;&amp;#x8FD9;&amp;#x4E00;&amp;#x70B9;&amp;#xFF0C;&amp;#x901A;&amp;#x8FC7;&amp;#x6539;&amp;#x53D8;&amp;#x4E0A;&amp;#x9762;&amp;#x4EE3;&amp;#x7801;&amp;#x4E2D;&amp;#x7684;&lt;code&gt;pushState&lt;/code&gt;&amp;#x4E3A;&lt;code&gt;replaceState&lt;/code&gt; &amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x8FD9;&amp;#x6837;&amp;#x6211;&amp;#x4EEC;&amp;#x6BCF;&amp;#x6B21;&amp;#x66FF;&amp;#x6362;&amp;#x5F53;&amp;#x524D;&amp;#x7684;&amp;#x72B6;&amp;#x6001;&amp;#x800C;&amp;#x4E0D;&amp;#x662F;&amp;#x5728;&amp;#x65B9;&amp;#x6CD5;&amp;#x88AB;&amp;#x8C03;&amp;#x7528;&amp;#x65F6;&amp;#x5047;&amp;#x5982;&amp;#x53E6;&amp;#x4E00;&amp;#x4E2A;&amp;#x72B6;&amp;#x6001;&amp;#x3002;&amp;#x202C;&lt;/p&gt; &lt;p class="codeFilePath"&gt;/public/javascripts/application.js&lt;/p&gt; &lt;pre class="javascript"&gt;$(function () {
// Other functions omitted.
$(&amp;#39;#products_search input&amp;#39;).keyup(function () {
  var action = $(&amp;#39;#products_search&amp;#39;).attr(&amp;#39;action&amp;#39;);
  var formData = $(&amp;#39;#products_search&amp;#39;).serialize();
  $.get(action, formData, null, &amp;#39;script&amp;#39;);
  history.replaceState(null, &amp;quot;&amp;quot;, action + &amp;quot;?&amp;quot; + formData);    return false;
}); 
}&amp;#xFF09;&lt;/pre&gt; &lt;p&gt;&amp;#x202A;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x6253;&amp;#x5F00;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x7684;&amp;#x7A97;&amp;#x53E3;&amp;#x505A;&amp;#x4E00;&amp;#x4E2A;&amp;#x641C;&amp;#x7D22;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x770B;&amp;#x5230;URL&amp;#x7684;&amp;#x53D8;&amp;#x5316;&amp;#xFF0C;&amp;#x4F46;&amp;#x8FD9;&amp;#x79CD;&amp;#x6539;&amp;#x53D8;&amp;#x4E0D;&amp;#x4F1A;&amp;#x6DFB;&amp;#x52A0;&amp;#x5230;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x7684;&amp;#x5386;&amp;#x53F2;&amp;#x8BB0;&amp;#x5F55;&amp;#x4E2D;&amp;#x53BB;&amp;#x3002;&amp;#x202C;
&lt;/p&gt; &lt;div class="imageWrapper"&gt; &lt;img src="/system/photos/539/original/E246I04.png" width="801" height="474" alt="&amp;#x202A;&amp;#x641C;&amp;#x7D22;&amp;#x8BCD;&amp;#x73B0;&amp;#x5728;&amp;#x88AB;&amp;#x6DFB;&amp;#x52A0;&amp;#x5230;URL&amp;#x3002;&amp;#x202C;"/&gt; &lt;/div&gt; &lt;p&gt;&amp;#x202A;&amp;#x8FD9;&amp;#x662F;&amp;#x529F;&amp;#x80FD;&amp;#x4E0D;&amp;#x50CF;&amp;#x6211;&amp;#x4EEC;&amp;#x60F3;&amp;#x7684;&amp;#x90A3;&amp;#x4E48;&amp;#x7406;&amp;#x60F3;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x7528;&amp;#x6237;&amp;#x5F00;&amp;#x59CB;&amp;#x641C;&amp;#x7D22;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;pushState&lt;/code&gt;&amp;#xFF0C;&amp;#x968F;&amp;#x540E;&amp;#x8C03;&amp;#x7528;&lt;code&gt;replaceState&lt;/code&gt;&amp;#xFF0C;&amp;#x4EE5;&amp;#x4FBF;&amp;#x641C;&amp;#x7D22;&amp;#x9879;&amp;#x88AB;&amp;#x6DFB;&amp;#x52A0;&amp;#x5230;&amp;#x5386;&amp;#x53F2;&amp;#x8BB0;&amp;#x5F55;&amp;#x4E2D;&amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x8FD9;&amp;#x4E2A;&amp;#x8D85;&amp;#x51FA;&amp;#x4E86;&amp;#x4E00;&amp;#x70B9;&amp;#x8FD9;&amp;#x4E00;&amp;#x96C6;&amp;#x7684;&amp;#x8303;&amp;#x56F4;&amp;#xFF0C;&amp;#x56E0;&amp;#x6B64;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x4E0D;&amp;#x4F1A;&amp;#x5728;&amp;#x8FD9;&amp;#x91CC;&amp;#x6D89;&amp;#x53CA;&amp;#x3002;&amp;#x202C;&lt;/p&gt; &lt;h3&gt;&amp;#x202A;&amp;#x7ED9;&amp;#x6BCF;&amp;#x4E2A;&amp;#x72B6;&amp;#x6001;&amp;#x6DFB;&amp;#x52A0;&amp;#x6807;&amp;#x9898;&amp;#x202C;&lt;/h3&gt; &lt;p&gt;&amp;#x202A;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x7528;&amp;#x51E0;&amp;#x4E2A;&amp;#x4E0D;&amp;#x540C;&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x6392;&amp;#x5E8F;&amp;#x4EA7;&amp;#x54C1;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x5355;&amp;#x51FB;&amp;#x5E76;&amp;#x6309;&amp;#x4F4F;&amp;#x540E;&amp;#x9000;&amp;#x6309;&amp;#x94AE;&amp;#x53BB;&amp;#x67E5;&amp;#x770B;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x7684;&amp;#x5386;&amp;#x53F2;&amp;#xFF0C;&amp;#x5B83;&amp;#x53EA;&amp;#x4F1A;&amp;#x663E;&amp;#x793A;&amp;#x6BCF;&amp;#x4E00;&amp;#x6B21;&amp;#x66F4;&amp;#x6539;&amp;#x7684;URL&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x4F1A;&amp;#x9000;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x5C31;&amp;#x5F88;&amp;#x96BE;&amp;#x9009;&amp;#x62E9;&amp;#x4E86;&amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x5982;&amp;#x679C;&amp;#x4E00;&amp;#x4E2A;&amp;#x6807;&amp;#x9898;&amp;#x800C;&amp;#x4E0D;&amp;#x662F;URL&amp;#x663E;&amp;#x793A;&amp;#x5728;&amp;#x754C;&amp;#x9762;&amp;#x4E0A;&amp;#x5C31;&amp;#x4F1A;&amp;#x8BA9;&amp;#x5386;&amp;#x53F2;&amp;#x8BB0;&amp;#x5F55;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x66F4;&amp;#x6709;&amp;#x7528;&amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x6211;&amp;#x4EEC;&amp;#x901A;&amp;#x8FC7;&amp;#x6BCF;&amp;#x6B21;&amp;#x8C03;&amp;#x7528;&lt;code&gt;pushState&lt;/code&gt;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x628A;&amp;#x7F51;&amp;#x9875;&amp;#x7684;&amp;#x6807;&amp;#x9898;&amp;#x8BBE;&amp;#x7F6E;&amp;#x4E3A;&amp;#x7B2C;&amp;#x4E8C;&amp;#x4E2A;&amp;#x53C2;&amp;#x6570;&amp;#x6765;&amp;#x5B9E;&amp;#x73B0;&amp;#x3002;&amp;#x202C;&lt;/p&gt; &lt;p&gt;&amp;#x202A;&amp;#x6211;&amp;#x4EEC;&amp;#x5982;&amp;#x4F55;&amp;#x8BBE;&amp;#x7F6E;&amp;#x6709;&amp;#x7528;&amp;#x7F51;&amp;#x9875;&amp;#x7684;&amp;#x6807;&amp;#x9898;&amp;#xFF1F;&amp;#x202C;&amp;#x202A;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x8981;&amp;#x505A;&amp;#x7684;&amp;#x662F;&amp;#x8BBE;&amp;#x7F6E;&amp;#x9875;&amp;#x9762;&amp;#x6807;&amp;#x9898;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x5728;pushState&amp;#x4E2D;&amp;#x4F7F;&amp;#x7528;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6807;&amp;#x9898;&amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5229;&amp;#x7528;&amp;#x5F53;&amp;#x4E00;&amp;#x4E2A;AJAX&amp;#x8BF7;&amp;#x6C42;&amp;#x5B8C;&amp;#x6210;&amp;#x540E;&amp;#x53D1;&amp;#x56DE;&amp;#x66F4;&amp;#x65B0;&amp;#x7528;&amp;#x7684;&lt;code&gt;index.js.erb&lt;/code&gt;&amp;#x6587;&amp;#x4EF6;&amp;#x8BBE;&amp;#x7F6E;&amp;#x8BBE;&amp;#x7F6E;&amp;#x6807;&amp;#x9898;&amp;#x3002;&amp;#x202C;&lt;/p&gt; &lt;p class="codeFilePath"&gt;/app/views/products/index.js.erb
&lt;/p&gt; &lt;pre class="javascript"&gt;$(&amp;#39;#products&amp;#39;).html(&amp;#39;&amp;lt;%= escape_javascript(render(&amp;quot;products&amp;quot;)) %&amp;gt;&amp;#39;);
document.title = &amp;quot;&amp;lt;%= escape_javascript(&amp;quot;#{params[:search].to_s.titleize} Products by #{(params[:sort] || &amp;#39;name&amp;#39;).titleize} - Page #{(params[:page] || 1)}&amp;quot;) %&amp;gt;&amp;quot;
&lt;/pre&gt; &lt;p&gt;&amp;#x202A;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x8BBE;&amp;#x7F6E;&amp;#x5305;&amp;#x542B;&amp;#x641C;&amp;#x7D22;&amp;#x548C;&amp;#x6392;&amp;#x5E8F;&amp;#x6761;&amp;#x4EF6;&amp;#x4E3A;&amp;#x5F53;&amp;#x524D;&amp;#x9875;&amp;#x9762;&amp;#x7684;&amp;#x6807;&amp;#x9898;&amp;#x540E;&amp;#xFF0C;&amp;#x6240;&amp;#x6709;&amp;#x76F8;&amp;#x5173;&amp;#x7684;&amp;#x4FE1;&amp;#x606F;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5F97;&amp;#x89C1;&amp;#x4E86;&amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x7136;&amp;#x540E;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x4FEE;&amp;#x6539;&lt;code&gt;pushState&lt;/code&gt;&amp;#x548C;&lt;code&gt;replaceState&lt;/code&gt;&amp;#x7684;&amp;#x8C03;&amp;#x7528;&amp;#xFF0C;&amp;#x8BA9;&amp;#x5B83;&amp;#x4EEC;&amp;#x66F4;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#x7684;&amp;#x6807;&amp;#x9898;&amp;#x3002;&amp;#x202C;&lt;/p&gt; &lt;p class="codeFilePath"&gt;/public/javascripts/application.js&lt;/p&gt; &lt;pre class="javascript"&gt;$(function () {
$(&amp;#39;#products th a, #products .pagination a&amp;#39;).live(&amp;#39;click&amp;#39;, function () {
  $.getScript(this.href);
  history.pushState(null, document.title, this.href);
  return false;
});

$(&amp;#39;#products_search input&amp;#39;).keyup(function () {
  var action = $(&amp;#39;#products_search&amp;#39;).attr(&amp;#39;action&amp;#39;);
  var formData = $(&amp;#39;#products_search&amp;#39;).serialize();
  $.get(action, formData, null, &amp;#39;script&amp;#39;);
  history.replaceState(null, document.title, action + &amp;quot;?&amp;quot; + formData);    return false;
});

$(window).bind(&amp;quot;popstate&amp;quot;, function () {
  $.getScript(location.href);
});
})
&lt;/pre&gt; &lt;p&gt;&amp;#x202A;&amp;#x73B0;&amp;#x5728;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x6BCF;&amp;#x6B21;&amp;#x641C;&amp;#x7D22;&amp;#x6216;&amp;#x6392;&amp;#x5E8F;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x7F51;&amp;#x9875;&amp;#x7684;&amp;#x6807;&amp;#x9898;&amp;#x90FD;&amp;#x4F1A;&amp;#x6539;&amp;#x53D8;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x770B;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x7684;&amp;#x5386;&amp;#x53F2;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;#x6807;&amp;#x9898;&amp;#x7684;&amp;#x5217;&amp;#x8868;&amp;#x800C;&amp;#x4E0D;&amp;#x662F;URL&amp;#x3002;&amp;#x202C;
&lt;/p&gt; &lt;div class="imageWrapper"&gt; &lt;img src="/system/photos/540/original/E246I05.png" width="801" height="476" alt="&amp;#x202A;&amp;#x6BCF;&amp;#x4E00;&amp;#x9875;&amp;#x7684;&amp;#x6807;&amp;#x9898;&amp;#x73B0;&amp;#x5728;&amp;#x663E;&amp;#x793A;&amp;#x5728;&amp;#x5386;&amp;#x53F2;&amp;#x8BB0;&amp;#x5F55;&amp;#x4E2D;&amp;#x3002;&amp;#x202C;"/&gt; &lt;/div&gt; &lt;h3&gt;&amp;#x202A;&amp;#x65E7;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x7684;&amp;#x5904;&amp;#x7406;&amp;#x202C;
&lt;/h3&gt; &lt;p&gt;&amp;#x202A;&amp;#x6211;&amp;#x4EEC;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x7684;&amp;#x65B0;&amp;#x529F;&amp;#x80FD;&amp;#x5DE5;&amp;#x4F5C;&amp;#x7684;&amp;#x975E;&amp;#x5E38;&amp;#x597D;&amp;#xFF0C;&amp;#x4F46;&amp;#x6211;&amp;#x4EEC;&amp;#x4E00;&amp;#x76F4;&amp;#x5047;&amp;#x8BBE;&lt;code&gt;history.pushState&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x5728;&amp;#x7528;&amp;#x6237;&amp;#x7684;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x4E2D;&amp;#x662F;&amp;#x53EF;&amp;#x7528;&amp;#x7684;&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;&amp;#x597D;&amp;#x50CF;&amp;#x53EA;&amp;#x6709;&amp;#x6700;&amp;#x65B0;&amp;#x7248;&amp;#x7684;Safari&amp;#xFF0C;Firefox&amp;#x548C;Chrome&amp;#x652F;&amp;#x6301;&amp;#x8FD9;&amp;#x4E2A;&amp;#x7279;&amp;#x6027;&amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x4E3A;&amp;#x4E86;&amp;#x5904;&amp;#x7406;&amp;#x6240;&amp;#x6709;&amp;#x7684;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#xFF0C;&amp;#x9996;&amp;#x5148;&amp;#x8981;&amp;#x68C0;&amp;#x67E5;&amp;#x8BE5;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x662F;&amp;#x5426;&amp;#x652F;&amp;#x6301;pushState&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x4FEE;&amp;#x6539;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x3002;&amp;#x202C;&lt;/p&gt; &lt;p&gt;&amp;#x202A;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x505A;&amp;#x7684;&amp;#x662F;&amp;#x68C0;&amp;#x67E5;&amp;#x662F;&amp;#x5224;&amp;#x65AD;&lt;code&gt;history&lt;/code&gt;&amp;#x5BF9;&amp;#x8C61;&amp;#x548C;0}history.pushState&amp;#x65B9;&amp;#x6CD5;&amp;#x662F;&amp;#x4E0D;&amp;#x662F;&amp;#x5B58;&amp;#x5728;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x4E0D;&amp;#x662F;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x5173;&amp;#x95ED;&amp;#x6240;&amp;#x6709;AJAX&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4F7F;&amp;#x7528;&amp;#x94FE;&amp;#x63A5;&amp;#x800C;&amp;#x4E0D;&amp;#x662F;AJAX&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F18;&amp;#x96C5;&amp;#x7684;&amp;#x964D;&amp;#x7EA7;&amp;#x3002;&amp;#x202C;
&lt;/p&gt; &lt;p class="codeFilePath"&gt;/public/javascripts/application.js&lt;/p&gt; &lt;pre class="javascript"&gt;if (history &amp;amp;&amp;amp; history.pushState) {
$(function () {
  $(&amp;#39;#products th a, #products .pagination a&amp;#39;).live(&amp;#39;click&amp;#39;, function () {
    $.getScript(this.href);
    history.pushState(null, document.title, this.href);
    return false;
  });

  $(&amp;#39;#products_search input&amp;#39;).keyup(function () {
    var action = $(&amp;#39;#products_search&amp;#39;).attr(&amp;#39;action&amp;#39;);
    var formData = $(&amp;#39;#products_search&amp;#39;).serialize();
    $.get(action, formData, null, &amp;#39;script&amp;#39;);
    history.replaceState(null, document.title, action + &amp;quot;?&amp;quot; + formData);      
    return false;
  });

  $(window).bind(&amp;quot;popstate&amp;quot;, function () {
    $.getScript(location.href);
  });
})
}
&lt;/pre&gt; &lt;p&gt;&amp;#x202A;&amp;#x8FD9;&amp;#x5C31;&amp;#x662F;&amp;#x8FD9;&amp;#x96C6;&amp;#x7684;&amp;#x5168;&amp;#x90E8;&amp;#x5185;&amp;#x5BB9;&amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x5B83;&amp;#x6CA1;&amp;#x6709;&amp;#x4F7F;&amp;#x7528;Rails&amp;#x7684;&amp;#x7279;&amp;#x5B9A;&amp;#x5904;&amp;#x7406;&amp;#x65B9;&amp;#x5F0F;&amp;#x53BB;&amp;#x5904;&amp;#x7406;Rails&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4E2D;&amp;#x7684;AJAX&amp;#x3002;&amp;#x202C;&amp;#x202A;&amp;#x5982;&amp;#x679C;&amp;#x80FD;&amp;#x591F;&amp;#x6539;&amp;#x53D8;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#x7F51;&amp;#x5740;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x80FD;&amp;#x50CF;&amp;#x5BF9;&amp;#x5F85;&amp;#x4F20;&amp;#x7EDF;&amp;#x7684;HTML&amp;#x94FE;&amp;#x63A5;&amp;#x4E00;&amp;#x6837;&amp;#x5BF9;&amp;#x5F85;AJAX&amp;#x94FE;&amp;#x63A5;&amp;#x3002;&amp;#x202C;&lt;/p&gt;</description>
      <pubDate>Sat, 08 Jan 2011 20:11:08 +0000</pubDate>
      <guid>http://cn.asciicasts.com/episodes/246-ajax-history-state</guid>
      <link>http://cn.asciicasts.com/episodes/246-ajax-history-state</link>
    </item>
    <item>
      <title>Active Model</title>
      <description>&lt;p&gt;&amp;#x5728;&amp;#x7B2C;193&amp;#x7BC7;&amp;#x3010;&lt;a href="http://railscasts.com/episodes/193-tableless-model"&gt;&amp;#x89C6;&amp;#x9891;&lt;/a&gt;,&amp;nbsp;&lt;a href="http://cn.asciicasts.com/episodes/193-tableless-model"&gt;&amp;#x6587;&amp;#x672C;&lt;/a&gt;&amp;#x3011;&amp;#x4E2D;&amp;#xFF0C;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;&amp;#x4E00;&amp;#x79CD;&amp;#x4E0D;&amp;#x4F7F;&amp;#x7528;&amp;#x5B9E;&amp;#x9645;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x7684;ActiveRecord&amp;#x7684;&amp;#x7528;&amp;#x6CD5;&amp;#x3002;&amp;#x5B9E;&amp;#x9645;&amp;#x8FD9;&amp;#x53EA;&amp;#x662F;&amp;#x56E0;&amp;#x4E3A;&amp;#x9700;&amp;#x6C42;&amp;#x800C;&amp;#x8FDB;&amp;#x884C;&amp;#x7684;hack&amp;#x7684;&amp;#x505A;&amp;#x6CD5;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;ActiveRecord&amp;#x6CA1;&amp;#x6709;&amp;#x8BBE;&amp;#x8BA1;&amp;#x8FD9;&amp;#x6837;&amp;#x7528;&amp;#x3002;&amp;#x4E0D;&amp;#x8FC7;&amp;#x5728;Rails 3&amp;#x91CC;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E2A;&amp;#x60C5;&amp;#x51B5;&amp;#x5DF2;&amp;#x7ECF;&amp;#x6539;&amp;#x53D8;&amp;#x3002;&amp;#x5728;Rails3&amp;#x91CC;ActiveModel&amp;#x662F;&amp;#x8BBE;&amp;#x8BA1;&amp;#x6765;&amp;#x89E3;&amp;#x51B3;&amp;#x4E0D;&amp;#x60F3;&amp;#x5B58;&amp;#x50A8;&amp;#x5230;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x7684;&amp;#x6570;&amp;#x636E;&amp;#x7684;&amp;#x9700;&amp;#x6C42;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x7BC7;&amp;#x7684;&amp;#x4E3B;&amp;#x9898;&amp;#x5C31;&amp;#x662F;&amp;#x4ECB;&amp;#x7ECD;ActiveModel&amp;#x7684;&amp;#x7528;&amp;#x6CD5;&amp;#x3002;&amp;#x5728;&amp;#x6B63;&amp;#x5F0F;&amp;#x4ECB;&amp;#x7ECD;&amp;#x5F00;&amp;#x59CB;&amp;#x524D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5148;&amp;#x770B;&amp;#x770B;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x8981;&amp;#x7528;&amp;#x6765;&amp;#x5C55;&amp;#x793A;&amp;#x7684;&amp;#x4F8B;&amp;#x5B50;&amp;#x3002;&lt;/p&gt; 

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/399/original/E219I01.png" width="801" height="465" alt="The form for creating a new message."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x622A;&amp;#x56FE;&amp;#x5C55;&amp;#x793A;&amp;#x4E00;&amp;#x4E2A;&amp;#x7528;rails &amp;#x811A;&amp;#x624B;&amp;#x67B6;&amp;#x521B;&amp;#x5EFA;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#xFF0C;&amp;#x5176;&amp;#x4E2D;Message&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;ActiveRecord&amp;#x7684;Model&amp;#x3002;&amp;#x4E5F;&amp;#x5C31;&amp;#x662F;&amp;#x811A;&amp;#x624B;&amp;#x67B6;&amp;#x9ED8;&amp;#x8BA4;&amp;#x7684;&amp;#x628A;Model&amp;#x5173;&amp;#x8054;&amp;#x5230;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x8981;&amp;#x505A;&amp;#x7684;&amp;#x662F;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EA;&amp;#x662F;&amp;#x628A;&amp;#x6D88;&amp;#x606F;&amp;#x901A;&amp;#x8FC7;email&amp;#x53D1;&amp;#x9001;&amp;#x4F46;&amp;#x662F;&amp;#x4E0D;&amp;#x4FDD;&amp;#x6301;&amp;#x6D88;&amp;#x606F;&amp;#x672C;&amp;#x8EAB;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x7136;&amp;#xFF0C;&amp;#x5728;&amp;#x4F60;&amp;#x8981;&amp;#x5F00;&amp;#x59CB;&amp;#x4F7F;&amp;#x7528;ActiveModel&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x4F60;&amp;#x5E94;&amp;#x8BE5;&amp;#x786E;&amp;#x8BA4;&amp;#x4F60;&amp;#x662F;&amp;#x4E0D;&amp;#x662F;&amp;#x771F;&amp;#x7684;&amp;#x6709;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#x9700;&amp;#x6C42;&amp;#x4E0D;&amp;#x4F7F;&amp;#x7528;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#xFF0C;&amp;#x628A;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x5B58;&amp;#x5230;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F5C;&amp;#x4E3A;&amp;#x4E00;&amp;#x79CD;&amp;#x6570;&amp;#x636E;&amp;#x7684;&amp;#x5907;&amp;#x4EFD;&amp;#xFF0C;&amp;#x6216;&amp;#x8005;&amp;#x7528;&amp;#x6765;&amp;#x8FDB;&amp;#x884C;&amp;#x540E;&amp;#x53F0;&amp;#x7684;&amp;#x5F02;&amp;#x6B65;&amp;#x64CD;&amp;#x4F5C;&amp;#xFF08;&amp;#x8BD1;&amp;#x8005;&amp;#x6653;&amp;#x591C;&amp;#x6CE8;&amp;#xFF1A;&amp;#x6BD4;&amp;#x5982;&amp;#x5F53;&amp;#x524D;&amp;#x4F8B;&amp;#x5B50;&amp;#x7684;message&amp;#x53EF;&amp;#x4EE5;&amp;#x5B58;&amp;#x5230;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x540E;&amp;#x5F02;&amp;#x6B65;&amp;#x8C03;&amp;#x7528;&amp;#x53D1;&amp;#x9001;&amp;#xFF09;&amp;#x3002;&amp;#x5BF9;&amp;#x4E8E;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x6F14;&amp;#x793A;&amp;#x800C;&amp;#x8A00;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x662F;&amp;#x8981;&amp;#x6F14;&amp;#x793A;&amp;#x600E;&amp;#x4E48;&amp;#x4F7F;&amp;#x7528;ActiveModel&amp;#xFF0C;&amp;#x4E5F;&amp;#x6CA1;&amp;#x4EC0;&amp;#x4E48;&amp;#x597D;&amp;#x8003;&amp;#x8651;&amp;#x3002;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x9996;&amp;#x5148;&amp;#xFF0C;&amp;#x770B;&amp;#x4E00;&amp;#x4E0B;Message&amp;#x7684;Model&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/message.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class Message &amp;lt; ActiveRecord::Base
 validates_presence_of :name
 validates_format_of :email, :with =&amp;gt; /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
 validates_length_of :content, :maximum =&amp;gt; 500
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x4ECE;Message Model&amp;#x7684;&amp;#x6E90;&amp;#x4EE3;&amp;#x7801;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;#xFF0C;Message&amp;#x662F;&amp;#x7EE7;&amp;#x627F;&amp;#x81EA;&lt;code&gt;ActiveRecord::Base&lt;/code&gt;&amp;#xFF0C;&amp;#x4E5F;&amp;#x5C31;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x4E0D;&amp;#x4F7F;&amp;#x7528;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x8981;&amp;#x89E3;&amp;#x9664;&amp;#x6765;&amp;#x81EA;ActiveRecord&amp;#x7684;&amp;#x7EE7;&amp;#x627F;&amp;#x5173;&amp;#x7CFB;&amp;#x3002;&amp;#x7136;&amp;#x800C;&amp;#xFF0C;&amp;#x663E;&amp;#x7136;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x53BB;&amp;#x6389;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;ActiveRecord&amp;#x7EE7;&amp;#x627F;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x8F93;&amp;#x5165;&amp;#x9A8C;&amp;#x8BC1;&amp;#x4E5F;&amp;#x5C31;&amp;#x4F1A;&amp;#x5931;&amp;#x6548;&amp;#x3002;&amp;#x4E5F;&amp;#x5C31;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x4F7F;&amp;#x7528;ActiveModel&amp;#x6765;&amp;#x652F;&amp;#x6301;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#x8F93;&amp;#x5165;&amp;#x9A8C;&amp;#x8BC1;&amp;#xFF0C;&amp;#x8FD9;&amp;#x70B9;&amp;#x5728;&amp;#x540E;&amp;#x6587;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x67E5;&amp;#x770B;Rails 3&amp;#x7684;&amp;#x6E90;&amp;#x4EE3;&amp;#x7801;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;nbsp;activerecord&amp;nbsp;&amp;#x548C;&amp;nbsp;activemodel&amp;#x7684;&amp;#x6587;&amp;#x4EF6;&amp;#x5939;&amp;#x3002;&amp;#x5B9E;&amp;#x9645;&amp;#x4E0A;&amp;#xFF0C;Rails&amp;#x6838;&amp;#x5FC3;&amp;#x56E2;&amp;#x961F;&amp;#x628A;&amp;#x6240;&amp;#x6709;&amp;#x548C;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x65E0;&amp;#x5173;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x653E;&amp;#x5230;ActiveModel&amp;#x4E0B;&amp;#x3002;&amp;#x6240;&amp;#x4EE5;&amp;#xFF0C;ActiveRecord&amp;#x5B9E;&amp;#x9645;&amp;#x4E0A;&amp;#x4F9D;&amp;#x8D56;ActiveModel&amp;#xFF0C;&amp;#x800C;ActiveModel&amp;#x662F;&amp;#x7ECF;&amp;#x8FC7;&amp;#x4E86;&amp;#x6D4B;&amp;#x8BD5;&amp;#xFF0C;&amp;#x5E76;&amp;#x4E14;&amp;#x53EF;&amp;#x4EE5;&amp;#x72EC;&amp;#x7ACB;&amp;#x4E8E;ActiveRecord&amp;#x4F7F;&amp;#x7528;&amp;#x7684;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x67E5;&amp;#x770B;ActiveModel&amp;#x76EE;&amp;#x5F55;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/400/original/E219I02.png" width="800" height="644" alt="The list of files in the ActiveModel directory."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x4ECE;&amp;#x4EE3;&amp;#x7801;&amp;#x5217;&amp;#x8868;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5927;&amp;#x6982;&amp;#x770B;&amp;#x51FA;&amp;#x6765;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E2A;&amp;#x76EE;&amp;#x5F55;&amp;#x4E0B;&amp;#x5C06;&amp;#x5305;&amp;#x62EC;&amp;#x5982;&amp;#x4E0B;&amp;#x529F;&amp;#x80FD;&amp;#x5904;&amp;#x7406;&amp;#x56DE;&amp;#x8C03;&amp;#xFF0C;dirty tracking&amp;#xFF0C; &amp;#x5E8F;&amp;#x5217;&amp;#x5316;&amp;#x548C;&amp;#x9A8C;&amp;#x8BC1;&amp;#xFF0C;&amp;#x7B49;&amp;#x7B49;&amp;#x3002;&amp;#x6BD4;&amp;#x8F83;&amp;#x663E;&amp;#x7136;&amp;#xFF0C;&amp;#x6700;&amp;#x540E;&amp;#x7684;&amp;#x4E09;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x7684;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6253;&amp;#x5F00;validations&amp;#x7684;&amp;#x6E90;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;#x5982;&amp;#x4E0B;&amp;#x7684;&amp;#x6CE8;&amp;#x91CA;&amp;#x3002;&amp;#x4ECE;&amp;#x6CE8;&amp;#x91CA;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x77E5;&amp;#x9053;&amp;#x4F7F;&amp;#x7528;&amp;#x9A8C;&amp;#x8BC1;&amp;#x76F8;&amp;#x5F53;&amp;#x5BB9;&amp;#x6613;&amp;#xFF0C;&amp;#x53EA;&amp;#x8981;&amp;#x628A;&amp;#x52A0;&amp;#x8F7D;&amp;nbsp;Validations&amp;#x6A21;&amp;#x5757;&amp;#x548C;&amp;#x63D0;&amp;#x4F9B;getter&amp;#x65B9;&amp;#x6CD5;&amp;#x7ED9;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x9A8C;&amp;#x8BC1;&amp;#x7684;&amp;#x5C5E;&amp;#x6027;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;nbsp;&amp;nbsp;# == Active Model Validations
&amp;nbsp;&amp;nbsp;#   
&amp;nbsp;&amp;nbsp;# Provides a full validation framework to your objects.
&amp;nbsp;&amp;nbsp;# 
&amp;nbsp;&amp;nbsp;# A minimal implementation could be:
&amp;nbsp;&amp;nbsp;# 
&amp;nbsp;&amp;nbsp;#   class Person
&amp;nbsp;&amp;nbsp;#     include ActiveModel::Validations
&amp;nbsp;&amp;nbsp;# 
&amp;nbsp;&amp;nbsp;#     attr_accessor :first_name, :last_name
&amp;nbsp;&amp;nbsp;#
&amp;nbsp;&amp;nbsp;#     validates_each :first_name, :last_name do |record, attr, value|
&amp;nbsp;&amp;nbsp;#       record.errors.add attr, &amp;#x27;starts with z.&amp;#x27; if value.to_s[0] == ?z
&amp;nbsp;&amp;nbsp;#     end
&amp;nbsp;&amp;nbsp;#   end
&amp;nbsp;&amp;nbsp;# 
&lt;/pre&gt;

&lt;p&gt;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x6839;&amp;#x636E;&amp;#x6CE8;&amp;#x91CA;&amp;#x4FEE;&amp;#x6539;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;Message Model&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/message.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class Message
  include ActiveModel::Validations
  
  attr_accessor :name, :email, :content
 
  validates_presence_of :name
  validates_format_of :email, :with =&amp;gt; /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
  validates_length_of :content, :maximum =&amp;gt; 500
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x5F53;&amp;#x524D;&amp;#x6211;&amp;#x4EEC;&amp;#x4FEE;&amp;#x6539;&amp;#x540E;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x4F1A;&amp;#x6709;&amp;#x4E24;&amp;#x4E2A;&amp;#x95EE;&amp;#x9898;&amp;#xFF1A;1. &amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x521B;&amp;#x5EFA;&lt;code&gt;Message&lt;/code&gt;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&lt;code&gt;Message.new&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x4F1A;&amp;#x56E0;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;initializer&amp;#x65B9;&amp;#x6CD5;&amp;#x4E2D;&amp;#x4E0D;&amp;#x80FD;&amp;#x521B;&amp;#x5EFA;&amp;#x63A5;&amp;#x6536;&amp;#x53C2;&amp;#x6570;&amp;#x7684;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x63D2;&amp;#x5165;&amp;#x64CD;&amp;#x4F5C;&amp;#x800C;&amp;#x5931;&amp;#x6548;&amp;#x3002;2. &amp;#x540C;&amp;#x6837;&amp;#x7684;save&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x539F;&amp;#x672C;&amp;#x4F1A;&amp;#x4FDD;&amp;#x5B58;&amp;#x5230;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x73B0;&amp;#x5728;&amp;#x4E5F;&amp;#x5C06;&amp;#x5931;&amp;#x6548;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/apps/controllers/messages_controller.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class MessagesController &amp;lt; ApplicationController
  def new
    @message = Message.new
  end

  def create
    @message = Message.new(params[:message])
    if @message.save
      # TODO send message here
      flash[:notice] = &amp;quot;Message sent! Thank you for contacting us.&amp;quot;
      redirect_to root_url
    else
      render :action =&amp;gt; &amp;#x27;new&amp;#x27;
    end
  end
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x9996;&amp;#x5148;&amp;#x4FEE;&amp;#x6539;&amp;#x4FDD;&amp;#x5B58;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x5E76;&amp;#x4E0D;&amp;#x9700;&amp;#x8981;&amp;#x4FDD;&amp;#x5B58;message&amp;#x672C;&amp;#x8EAB;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;save&amp;#x65B9;&amp;#x6CD5;&amp;#x53EA;&amp;#x9700;&amp;#x8981;&amp;#x8FDB;&amp;#x884C;&amp;#x9A8C;&amp;#x8BC1;&amp;#x64CD;&amp;#x4F5C;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x3002;&amp;#x4E5F;&amp;#x5C31;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x53EA;&amp;#x9700;&amp;#x8981;&amp;#x7528;&lt;code&gt;@message.valid?&lt;/code&gt; &amp;#x65B9;&amp;#x6CD5;&amp;#x4EE3;&amp;#x66FF;&lt;code&gt;@message.save&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/controllers/messages_controllers.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
def create
  @message = Message.new(params[:message])
  if @message.valid?
    # TODO send message here
    flash[:notice] = &amp;quot;Message sent! Thank you for contacting us.&amp;quot;
    redirect_to root_url
  else
    render :action =&amp;gt; &amp;#x27;new&amp;#x27;
  end
end
&lt;/pre&gt;


&lt;p&gt;&amp;#x81F3;&amp;#x4E8E;&amp;#xFF0C;&amp;#x521B;&amp;#x5EFA;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x4E2A;&lt;code&gt;initialize&lt;/code&gt;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#x6765;&amp;#x63A5;&amp;#x6536;&amp;#x4F20;&amp;#x5165;&lt;code&gt;Message&lt;/code&gt;&amp;#x7684;&amp;#x54C8;&amp;#x5E0C;&amp;#x53C2;&amp;#x6570;&amp;#xFF0C;&amp;#x5728;initializer&amp;#x65B9;&amp;#x6CD5;&amp;#x4E2D;&amp;#xFF0C;&amp;#x901A;&amp;#x8FC7;&amp;#x8C03;&amp;#x7528;&lt;code&gt;send&lt;/code&gt;&amp;#xFF08;&amp;#x8BD1;&amp;#x8005;&amp;#x6653;&amp;#x591C;&amp;#xFF1A;&amp;#x8C03;&amp;#x7528;&amp;#x53D8;&amp;#x91CF;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF09;&amp;#x65B9;&amp;#x6CD5;&amp;#x7ED9;&amp;#x6307;&amp;#x5B9A;&amp;#x7684;&amp;#x5C5E;&amp;#x6027;&amp;#x8D4B;&amp;#x503C;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/message.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class Message
  include ActiveModel::Validations
  
  attr_accessor :name, :email, :content
 
  validates_presence_of :name
  validates_format_of :email, :with =&amp;gt; /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
  validates_length_of :content, :maximum =&amp;gt; 500
  
  def initialize(attributes = {})
    attributes.each do |name, value|
      send(&amp;quot;#{name}=&amp;quot;, value)
    end
  end
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x770B;&amp;#x8D77;&amp;#x6765;&amp;#x5E94;&amp;#x8BE5;&amp;#x6CA1;&amp;#x6709;&amp;#x4EC0;&amp;#x4E48;&amp;#x95EE;&amp;#x9898;&amp;#x4E86;&amp;#xFF0C;&amp;#x53EF;&amp;#x662F;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x91CD;&amp;#x65B0;&amp;#x52A0;&amp;#x8F7D;&amp;#x9875;&amp;#x9762;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;#x5982;&amp;#x4E0B;&amp;#x9519;&amp;#x8BEF;&amp;#xFF1A;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/401/original/E219I03.png" width="796" height="510" alt="The form throws an error."/&gt;
&lt;/div&gt;
 
&lt;p&gt;&amp;#x95EE;&amp;#x9898;&amp;#x662F;&amp;#x5728;&amp;#x4E8E;&amp;#x6211;&amp;#x4EEC;&amp;#x6CA1;&amp;#x6709;&amp;#x5728;Message&amp;#x4E2D;&amp;#x5B9A;&amp;#x4E49;to_key&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;form_for&amp;#x9ED8;&amp;#x8BA4;&amp;#x7684;&amp;#x8BA4;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;model&amp;#x63D0;&amp;#x4F9B;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x6DFB;&amp;#x52A0;&amp;#x8FD9;&amp;#x4E2A;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5B9E;&amp;#x9645;&amp;#x4E0A;&amp;#xFF0C;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0D;&amp;#x77E5;&amp;#x9053;Rails&amp;#x90FD;&amp;#x9700;&amp;#x8981;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;model&amp;#x63D0;&amp;#x4F9B;&amp;#x4EC0;&amp;#x4E48;&amp;#x529F;&amp;#x80FD;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x52A0;&amp;#x8F7D;ActiveModel::Lint::Tests&amp;#x6A21;&amp;#x5757;&amp;#x5230;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;modle&amp;#x6D4B;&amp;#x8BD5;&amp;#x4E2D;&amp;#x3002;&amp;#x5728;Lint::Tests&amp;#x6A21;&amp;#x5757;&amp;#x4E2D;&amp;#x5C55;&amp;#x793A;&amp;#x51FA;&amp;#x5305;&amp;#x62EC;to_key&amp;#x5728;&amp;#x5185;&amp;#x7684;Rails&amp;#x5B9A;&amp;#x4E49;&amp;#x7684;model&amp;#x9700;&amp;#x8981;&amp;#x63D0;&amp;#x4F9B;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#x3002; &amp;#x81F3;&amp;#x4E8E;&amp;#xFF0C;&amp;#x5982;&amp;#x4F55;&amp;#x89E3;&amp;#x51B3;&amp;#x7F3A;&amp;#x5C11;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x52A0;&amp;#x8F7D;&amp;#x4E00;&amp;#x7EC4;ActiveRecord&amp;#x7684;&amp;#x6A21;&amp;#x5757;&amp;#x6765;&amp;#x89E3;&amp;#x51B3;&amp;#x3002;&amp;nbsp;&lt;a href="http://github.com/rails/rails/blob/master/activemodel/lib/active_model/conversion.rb"&gt;&lt;code&gt;Conversion&lt;/code&gt;&lt;/a&gt;&amp;#x662F;&amp;#x5176;&amp;#x4E2D;&amp;#x5305;&amp;#x62EC;to_key&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;&amp;#x6A21;&amp;#x5757;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x4E5F;&amp;#x9700;&amp;#x8981;&lt;a href="http://github.com/rails/rails/blob/master/activemodel/lib/active_model/naming.rb"&gt;&lt;code&gt;Naming&lt;/code&gt;&lt;/a&gt;&amp;nbsp;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x8FD9;&amp;#x91CC;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0D;&amp;#x4F7F;&amp;#x7528;include&amp;#x800C;&amp;#x662F;&amp;#x4F7F;&amp;#x7528;extend&amp;#x56E0;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x7C7B;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF08;&amp;#x8BD1;&amp;#x8005;&amp;#x6653;&amp;#x591C;&amp;#xFF1A;&amp;#x5BF9;&amp;#x5E94;&amp;#x4E8E;include&amp;#x7C7B;&amp;#x5B9E;&amp;#x4F8B;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF09;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5F15;&amp;#x5165;&amp;#x4E86;&lt;code&gt;Conversion&lt;/code&gt;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x91CD;&amp;#x65B0;&amp;#x5B9A;&amp;#x4E49;persisted?&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0D;&amp;#x9700;&amp;#x8981;&amp;#x4F7F;&amp;#x7528;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x6240;&amp;#x4EE5;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5462;&amp;#x9700;&amp;#x8981;persisted&amp;#x65B9;&amp;#x6CD5;&amp;#x8FD4;&amp;#x56DE;&lt;code&gt;false&lt;/code&gt;&amp;#x3002;&amp;#x6240;&amp;#x4EE5;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;Message Model&amp;#x5C06;&amp;#x4F1A;&amp;#x4FEE;&amp;#x6539;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/message.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class Message
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming
  
  attr_accessor :name, :email, :content
 
  validates_presence_of :name
  validates_format_of :email, :with =&amp;gt; /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
  validates_length_of :content, :maximum =&amp;gt; 500
  
  def initialize(attributes = {})
    attributes.each do |name, value|
      send(&amp;quot;#{name}=&amp;quot;, value)
    end
  end
  
  def persisted?
    false
  end
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x65F6;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x518D;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;#x5DF2;&amp;#x7ECF;&amp;#x80FD;&amp;#x591F;&amp;#x6B63;&amp;#x5E38;&amp;#x663E;&amp;#x793A;&amp;#x4E86;&amp;#xFF0C;&amp;#x4E5F;&amp;#x5C31;&amp;#x662F;&amp;#x8BF4;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;Message model&amp;#x5DF2;&amp;#x7ECF;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;Rails3&amp;#x9700;&amp;#x8981;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#x3002;&amp;#x63D0;&amp;#x4EA4;form&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x53D1;&amp;#x73B0;&amp;#x9A8C;&amp;#x8BC1;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x6B63;&amp;#x5E38;&amp;#x4F7F;&amp;#x7528;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/402/original/E219I04.png" width="800" height="631" alt="The form now works, including the validators."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x5B9E;&amp;#x9645;&amp;#x4E0A;&amp;#x6211;&amp;#x4EEC;&amp;#x53EA;&amp;#x662F;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;ActiveModel&amp;#x4E2D;&amp;#x5F88;&amp;#x5C11;&amp;#x7684;&amp;#x4E00;&amp;#x90E8;&amp;#x5206;&amp;#x529F;&amp;#x80FD;&amp;#x3002;ActiveModel&amp;#x4E2D;&amp;#x8FD8;&amp;#x6709;&amp;#x66F4;&amp;#x591A;&amp;#x503C;&amp;#x5F97;&amp;#x4E86;&amp;#x89E3;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x5E78;&amp;#x597D;&amp;#x8FD9;&amp;#x90E8;&amp;#x5206;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x7ED3;&amp;#x6784;&amp;#x548C;&amp;#x6CE8;&amp;#x91CA;&amp;#x5199;&amp;#x7684;&amp;#x5F88;&amp;#x597D;&amp;#xFF0C;&amp;#x5728;&amp;#x4F60;&amp;#x9700;&amp;#x8981;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x53EA;&amp;#x8981;&amp;#x53C2;&amp;#x8003;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x6E90;&amp;#x4EE3;&amp;#x7801;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x5F88;&amp;#x597D;&amp;#x7684;&amp;#x4E86;&amp;#x89E3;&amp;#x5982;&amp;#x4F55;&amp;#x4F7F;&amp;#x7528;&amp;#x3002;&lt;/p&gt;
</description>
      <pubDate>Mon, 13 Sep 2010 21:09:02 +0000</pubDate>
      <guid>http://cn.asciicasts.com/episodes/219-active-model</guid>
      <link>http://cn.asciicasts.com/episodes/219-active-model</link>
    </item>
    <item>
      <title>Rails 3&#160;&#20013;&#30340;&#39640;&#32423;&#26597;&#35810;</title>
      <description>&lt;p&gt;&amp;#x5728;&amp;#x8FD9;&amp;#x4E00;&amp;#x96C6;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x63A5;&amp;#x7740;&amp;#x7B2C;202&amp;#x96C6;&amp;#x7684;&amp;#x89C6;&amp;#x9891;&amp;#xFF0C;&amp;#x5C55;&amp;#x793A;Rails 3&amp;#x4E2D;&amp;#x5C06;&amp;#x8981;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;&amp;#x9AD8;&amp;#x7EA7;&amp;#x67E5;&amp;#x8BE2;&amp;#xFF0C;&amp;#x7B2C;202&amp;#x96C6;Railscast&amp;#x3010;&lt;a href="http://railscasts.com/episodes/202-active-record-queries-in-rails-3"&gt;&amp;#x89C6;&amp;#x9891;&lt;/a&gt;&amp;#xFF0C;&lt;a href="http://cn.asciicasts.com/episodes/202-active-record-queries-in-rails-3"&gt;&amp;#x6587;&amp;#x672C;&lt;/a&gt;&amp;#x3011;&amp;#x89C6;&amp;#x9891;&amp;#x4E2D;&amp;#x6211;&amp;#x4EEC;&amp;#x5C55;&amp;#x793A;&amp;#x4E86;Rails 3&amp;#x4E2D;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;&amp;#x67E5;&amp;#x8BE2;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;&amp;#x7528;&amp;#x7C7B;&amp;#x65B9;&amp;#x6CD5;&amp;#x4EE3;&amp;#x66FF;Scopes&lt;/h3&gt;

&lt;p&gt;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x6765;&amp;#x5C55;&amp;#x793A;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4E2D;&amp;#x5305;&amp;#x62EC;&amp;#x4E24;&amp;#x4E2A;&amp;#x6A21;&amp;#x578B;&amp;#xFF1A;&lt;code&gt;Product&lt;/code&gt;&amp;nbsp;&amp;#x548C;&amp;nbsp;&lt;code&gt;Category&lt;/code&gt;&amp;#xFF0C;&amp;#x5176;&amp;#x4E2D;&amp;#xFF0C;Product&amp;#x5C5E;&amp;#x4E8E;Category&amp;#xFF0C;&amp;#x5E76;&amp;#x4E14;&amp;#x5728;product&amp;#x6A21;&amp;#x578B;&amp;#x4E2D;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;named scope: &lt;code&gt;discontinued&lt;/code&gt;, &amp;#x7528;&amp;#x6765;&amp;#x8868;&amp;#x793A;&amp;#x5DF2;&amp;#x7ECF;&amp;#x505C;&amp;#x4EA7;&amp;#x548C;&amp;#x4EF7;&amp;#x94B1;&amp;#x4F4E;&amp;#x4E8E;&amp;#x4E00;&amp;#x4E2A;&amp;#x7ED9;&amp;#x5B9A;&amp;#x7684;&amp;#x503C;&amp;#x7684;&amp;#x4EA7;&amp;#x54C1;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/product.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class Product &amp;lt; ActiveRecord::Base
  belongs_to :category
  scope :discontinued, where(:discontinued =&amp;gt; true)
  scope :cheaper_than, lambda { |price| where(&amp;quot;price &amp;lt; ?&amp;quot;, price) }
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x5176;&amp;#x4E2D;&amp;#xFF0C;&amp;#x5728;&amp;#x7B2C;&amp;#x4E8C;&amp;#x4E2A;named scope&amp;#x7684;&amp;#x63CF;&amp;#x8FF0;&amp;#x4E2D;&amp;#x6211;&amp;#x4EEC;&amp;#x7528;&amp;#x5230;&amp;#x4E86;lambda&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x4F7F;&amp;#x7528;&amp;#x8FC7;named scope&amp;#x7279;&amp;#x522B;&amp;#x662F;&amp;#x6709;&amp;#x9700;&amp;#x8981;&amp;#x5927;&amp;#x91CF;&amp;#x4F20;&amp;#x5165;&amp;#x53C2;&amp;#x6570;&amp;#x6216;&amp;#x8005;&amp;#x662F;scope&amp;#x672C;&amp;#x8EAB;&amp;#x903B;&amp;#x8F91;&amp;#x590D;&amp;#x6742;&amp;#x7684;&amp;#x60C5;&amp;#x51B5;&amp;#x4E0B;&amp;#xFF0C;&amp;#x90FD;&amp;#x4F1A;&amp;#x8003;&amp;#x8651;&amp;#x8981;&amp;#x628A;scope&amp;#x62BD;&amp;#x51FA;&amp;#x6765;&amp;#x5199;&amp;#x5230;&amp;#x65B9;&amp;#x6CD5;&amp;#x91CC;&amp;#xFF0C;&amp;#x867D;&amp;#x7136;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5F53;&amp;#x524D;&amp;#x7684;&amp;#x4F8B;&amp;#x5B50;&amp;#x5E76;&amp;#x6CA1;&amp;#x6709;&amp;#x4EC0;&amp;#x4E48;&amp;#x590D;&amp;#x6742;&amp;#x7684;&amp;#xFF0C;&amp;#x4E3A;&amp;#x4E86;&amp;#x6F14;&amp;#x793A;&amp;#x6211;&amp;#x4EEC;&amp;#x540C;&amp;#x6837;&amp;#x62BD;&amp;#x6210;&amp;#x65B9;&amp;#x6CD5;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/product.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class Product &amp;lt; ActiveRecord::Base
  belongs_to :category
  scope :discontinued, where(:discontinued =&amp;gt; true)
  
  def self.cheaper_than(price)
    where(&amp;quot;price &amp;lt; ?&amp;quot;, price)
  end
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x5982;&amp;#x4E0A;&amp;#x62BD;&amp;#x51FA;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;scope&amp;#x548C;&amp;#x539F;&amp;#x6765;&amp;#x7684;scope&amp;#x6709;&amp;#x540C;&amp;#x6837;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#xFF0C;&amp;#x867D;&amp;#x7136;&amp;#x5728;Rails 2&amp;#x4E2D;&amp;#x540C;&amp;#x6837;&amp;#x652F;&amp;#x6301;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#x64CD;&amp;#x4F5C;&amp;#xFF0C;&amp;#x7136;&amp;#x800C;&amp;#xFF0C;&amp;#x5728;rails 3&amp;#x4E2D;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#x62BD;&amp;#x8C61;&amp;#x4F1A;&amp;#x6709;&amp;#x66F4;&amp;#x5B8C;&amp;#x5584;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&amp;#x5047;&amp;#x8BBE;&amp;#x6211;&amp;#x4EEC;&amp;#x6709;&amp;#x53E6;&amp;#x5916;&amp;#x4E00;&amp;#x4E2A;scope Cheap&amp;#x8868;&amp;#x793A;&amp;#x4EF7;&amp;#x94B1;&amp;#x4F4E;&amp;#x4E8E;5&amp;#x7684;&amp;#x4EA7;&amp;#x54C1;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x91CD;&amp;#x7528;&amp;#x4E4B;&amp;#x524D;&amp;#x4E3A;&amp;#x4E86;&amp;#x4F7F;&amp;#x7528;scope&amp;#x800C;&amp;#x521B;&amp;#x5EFA;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x6784;&amp;#x9020;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/products.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
scope :cheap, cheaper_than(5)
&lt;/pre&gt;

&lt;p&gt;&amp;#x7136;&amp;#x800C;&amp;#xFF0C;&amp;#x8FD9;&amp;#x91CC;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x6F5C;&amp;#x5728;&amp;#x7684;&amp;#x9677;&amp;#x9631;&amp;#xFF0C;&amp;#x5C31;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;scope&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;&amp;#x5B9A;&amp;#x4E49;&amp;#x8981;&amp;#x653E;&amp;#x5230;&amp;#x5176;&amp;#x4ED6;&amp;#x7684;&amp;#x7C7B;&amp;#x5B9A;&amp;#x4E49;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;&amp;#x540E;&amp;#x9762;&amp;#xFF0C;&amp;#x4E5F;&amp;#x5C31;&amp;#x662F;&amp;#x8BF4;&amp;#x5E26;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;scope&amp;#x4F1A;&amp;#x5728;&amp;#x666E;&amp;#x901A;scope&amp;#x7684;&amp;#x4F4D;&amp;#x7F6E;&amp;#x9760;&amp;#x540E;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5728;rails &amp;#x63A7;&amp;#x5236;&amp;#x53F0;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;scope&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;SQL&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
ruby-1.8.7-p249 &amp;gt; Product.cheap.to_sql
 =&amp;gt; &amp;quot;SELECT    \&amp;quot;products\&amp;quot;.* FROM      \&amp;quot;products\&amp;quot; WHERE    (price &amp;lt; 5)&amp;quot;
&lt;/pre&gt; 

&lt;p&gt;&amp;#x76F4;&amp;#x63A5;&amp;#x8C03;&amp;#x7528;&amp;#x5B9A;&amp;#x4E49;&amp;#x7684;scope&amp;#x4F1A;&amp;#x663E;&amp;#x793A;&amp;#x7B26;&amp;#x5408;scope&amp;#x6761;&amp;#x4EF6;&amp;#x7684;&amp;#x4EA7;&amp;#x54C1;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt;Product.cheap
 =&amp;gt; [#&amp;lt;Product id: 1, name: &amp;quot;Top&amp;quot;, price: 4.99, discontinued: nil, category_id: 3, created_at: &amp;quot;2010-05-24 21:01:59&amp;quot;, updated_at: &amp;quot;2010-05-24 21:01:59&amp;quot;&amp;gt;, #&amp;lt;Product id: 2, name: &amp;quot;Milk&amp;quot;, price: 2.99, discontinued: nil, category_id: 2, created_at: &amp;quot;2010-05-24 21:02:38&amp;quot;, updated_at: &amp;quot;2010-05-24 21:02:38&amp;quot;&amp;gt;]
&lt;/pre&gt;

&lt;h3&gt;&amp;#x5173;&amp;#x8054;&lt;/h3&gt;

&lt;p&gt;&amp;#x5728;Rails&amp;#x63A7;&amp;#x5236;&amp;#x53F0;&amp;#x4E0B;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5C55;&amp;#x793A;&amp;#x53E6;&amp;#x5916;&amp;#x4E00;&amp;#x4E2A;&amp;#x901A;&amp;#x8FC7;&amp;#x5173;&amp;#x8054;&amp;#x4F7F;&amp;#x7528;scope&amp;#x7684;&amp;#x6280;&amp;#x5DE7;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x4E4B;&amp;#x524D;&amp;#x63D0;&amp;#x5230;Product&amp;#x548C;category&amp;#x6709;belongs_to&amp;#x7684;&amp;#x5173;&amp;#x8054;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#xFF0C;&amp;#x4E5F;&amp;#x5C31;&amp;#x662F;&amp;#x8BF4;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;joins&lt;/code&gt;&amp;#x6765;&amp;#x8FD4;&amp;#x56DE;SQL&amp;#x7684;join&amp;#x8868;&amp;#x7684;&amp;#x67E5;&amp;#x8BE2;&lt;/p&gt;

&lt;pre class="terminal"&gt;
ruby-1.8.7-p249 &amp;gt; Category.joins(:products).to_sql
 =&amp;gt; &amp;quot;SELECT     \&amp;quot;categories\&amp;quot;.* FROM       \&amp;quot;categories\&amp;quot; INNER JOIN \&amp;quot;products\&amp;quot; ON \&amp;quot;products\&amp;quot;.\&amp;quot;category_id\&amp;quot; = \&amp;quot;categories\&amp;quot;.\&amp;quot;id\&amp;quot;&amp;quot;
&lt;/pre&gt; 

&lt;p&gt;&amp;#x4E0B;&amp;#x9762;&amp;#x662F;&amp;#x5173;&amp;#x4E8E;&amp;#x7B26;&amp;#x5408;&amp;#x7279;&amp;#x5B9A;scope&amp;#x7684;&amp;#x67E5;&amp;#x8BE2;&amp;#x7684;&amp;#x5199;&amp;#x6CD5;&amp;#xFF0C;&amp;#x6BD4;&amp;#x5982;&amp;#x6211;&amp;#x4EEC;&amp;#x5E0C;&amp;#x671B;&amp;#x67E5;&amp;#x8BE2;&amp;#x81F3;&amp;#x5C11;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x4EA7;&amp;#x54C1;&amp;#x7684;&amp;#x4EF7;&amp;#x503C;&amp;#x662F;&amp;#x4F4E;&amp;#x4E8E;5&amp;#x7684;&amp;#x6240;&amp;#x6709;&amp;#x79CD;&amp;#x7C7B;&amp;#x3002;&amp;#x90A3;&amp;#x4E48;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x6709;&amp;#x4E0B;&amp;#x9762;&amp;#x7684;&amp;#x4E24;&amp;#x79CD;&amp;#x5199;&amp;#x6CD5;&amp;#xFF0C;&amp;#x4E00;&amp;#x79CD;&amp;#x662F;&amp;#x7528;&lt;code&gt;merge&lt;/code&gt;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt; Category.joins(:products).merge(Product.cheap)
 =&amp;gt; [#&amp;lt;Category id: 3, name: &amp;quot;Games&amp;quot;, created_at: &amp;quot;2010-05-24 21:00:57&amp;quot;, updated_at: &amp;quot;2010-05-25 18:30:18&amp;quot;&amp;gt;, #&amp;lt;Category id: 2, name: &amp;quot;Groceries&amp;quot;, created_at: &amp;quot;2010-05-24 21:00:50&amp;quot;, updated_at: &amp;quot;2010-05-25 18:30:39&amp;quot;&amp;gt;]
&lt;/pre&gt; 

&lt;p&gt;&amp;#x540C;&amp;#x6837;&amp;#x7684;&amp;#x6211;&amp;#x4EEC;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;&amp;#x548C;&lt;code&gt;merge&lt;/code&gt;&amp;#x6709;&amp;#x76F8;&amp;#x540C;&amp;#x542B;&amp;#x4E49;&amp;#x7684;&lt;code&gt;&amp;amp;&lt;/code&gt;&amp;#x6765;&amp;#x8868;&amp;#x8FBE;&amp;#x5982;&amp;#x4E0B;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt; Category.joins(:products) &amp;amp; Product.cheap
 =&amp;gt; [#&amp;lt;Category id: 3, name: &amp;quot;Games&amp;quot;, created_at: &amp;quot;2010-05-24 21:00:57&amp;quot;, updated_at: &amp;quot;2010-05-25 18:30:18&amp;quot;&amp;gt;, #&amp;lt;Category id: 2, name: &amp;quot;Groceries&amp;quot;, created_at: &amp;quot;2010-05-24 21:00:50&amp;quot;, updated_at: &amp;quot;2010-05-25 18:30:39&amp;quot;&amp;gt;]
&lt;/pre&gt; 

&lt;p&gt;&amp;#x4F7F;&amp;#x7528;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5173;&amp;#x8054;&amp;#x4E00;&amp;#x4E9B;&amp;#x4E0D;&amp;#x5728;&amp;#x81EA;&amp;#x5DF1;model&amp;#x7684;&amp;#x68C0;&amp;#x7D22;&amp;#x6761;&amp;#x4EF6;&amp;#xFF0C;&amp;#x6BD4;&amp;#x5982;&amp;#x6211;&amp;#x4EEC;&amp;#x5E0C;&amp;#x671B;&amp;#x67E5;&amp;#x8BE2;&amp;#x6240;&amp;#x6709;&amp;#x4EA7;&amp;#x54C1;&amp;#x7684;&amp;#x4EF7;&amp;#x503C;&amp;#x90FD;&amp;#x5C0F;&amp;#x4E8E;5&amp;#x7684;&amp;#x7C7B;&amp;#x522B;&amp;#x5982;&amp;#x4E0B;&amp;#xFF0C;&amp;#x5E76;&amp;#x4E14;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;to_sql&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x67E5;&amp;#x770B;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;mysql&amp;#x7684;&amp;#x8BED;&amp;#x53E5;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt; (Category.joins(:products) &amp;amp; Product.cheap).to_sql
 =&amp;gt; &amp;quot;SELECT     \&amp;quot;categories\&amp;quot;.* FROM       \&amp;quot;categories\&amp;quot; INNER JOIN \&amp;quot;products\&amp;quot; ON \&amp;quot;products\&amp;quot;.\&amp;quot;category_id\&amp;quot; = \&amp;quot;categories\&amp;quot;.\&amp;quot;id\&amp;quot; WHERE     (price &amp;lt; 5)&amp;quot;
&lt;/pre&gt; 
 
&lt;p&gt;&amp;#x66F4;&amp;#x4E3A;&amp;#x5F3A;&amp;#x5927;&amp;#x7684;&amp;#x662F;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;named scope&amp;#x5B9A;&amp;#x4E49;&amp;#x4E2D;&amp;#x4F7F;&amp;#x7528;&amp;#x662F;&amp;#x5B9A;&amp;#x4E49;&amp;#x597D;&amp;#x7684;scope&amp;#x5C31;&amp;#x5982;&amp;#x540C;&amp;#x6211;&amp;#x4EEC;&amp;#x521A;&amp;#x521A;&amp;#x7528;&amp;#x5230;&amp;#x7684;&amp;#x3002;&amp;#x6BD4;&amp;#x5982;&amp;#xFF0C;&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x4E2A;&amp;#x5305;&amp;#x62EC;&amp;#x6240;&amp;#x6709;cheap &amp;#x4EA7;&amp;#x54C1;&amp;#x7684;&amp;#x7C7B;&amp;#x522B;,&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;
 
&lt;p class="codeFilePath"&gt;/app/models/category.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class Category &amp;lt; ActiveRecord::Base
  has_many :products
  scope :with_cheap_products, joins(:products) &amp;amp; Product.cheap
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x513F;named scope&amp;#x4F1A;&amp;#x8FD4;&amp;#x56DE;&amp;#x548C;&amp;#x6211;&amp;#x4EEC;&amp;#x4E4B;&amp;#x524D;&amp;#x7684;&amp;#x67E5;&amp;#x8BE2;&amp;#x76F8;&amp;#x540C;&amp;#x7684;&amp;#x6570;&amp;#x636E;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt; Category.with_cheap_products
 =&amp;gt; [#&amp;lt;Category id: 3, name: &amp;quot;Games&amp;quot;, created_at: &amp;quot;2010-05-24 21:00:57&amp;quot;, updated_at: &amp;quot;2010-05-25 18:30:18&amp;quot;&amp;gt;, #&amp;lt;Category id: 2, name: &amp;quot;Groceries&amp;quot;, created_at: &amp;quot;2010-05-24 21:00:50&amp;quot;, updated_at: &amp;quot;2010-05-25 18:30:39&amp;quot;&amp;gt;]
&lt;/pre&gt; 

&lt;p&gt;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x503C;&amp;#x5F97;&amp;#x6CE8;&amp;#x610F;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#x662F;&amp;#x5173;&amp;#x4E8E;&amp;#x591A;&amp;#x8868;&amp;#x5173;&amp;#x8054;&amp;#x67E5;&amp;#x8BE2;&amp;#x4E2D;&amp;#x7684;&amp;#x8868;&amp;#x540D;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E00;&amp;#x70B9;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x67E5;&amp;#x770B;&amp;#x4E0A;&amp;#x9762;&amp;#x6211;&amp;#x4EEC;&amp;#x5EFA;&amp;#x7ACB;&amp;#x7684;scope&amp;#x7684;sql&amp;#x770B;&amp;#x5230;&amp;#xFF1A;&amp;#x5B9E;&amp;#x9645;&amp;#x4E0A;&amp;#x5728;where&amp;#x67E5;&amp;#x8BE2;&amp;#x4E2D;&amp;#x6211;&amp;#x4EEC;&amp;#x5E76;&amp;#x6CA1;&amp;#x6709;&amp;#x5199;&amp;#x660E;&amp;#x7279;&amp;#x5B9A;&amp;#x7684;&amp;#x8868;&amp;#x540D;.&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt; Category.with_cheap_products.to_sql
 =&amp;gt; &amp;quot;SELECT     \&amp;quot;categories\&amp;quot;.* FROM       \&amp;quot;categories\&amp;quot; INNER JOIN \&amp;quot;products\&amp;quot; ON \&amp;quot;products\&amp;quot;.\&amp;quot;category_id\&amp;quot; = \&amp;quot;categories\&amp;quot;.\&amp;quot;id\&amp;quot; WHERE     (price &amp;lt; 5)&amp;quot;
&lt;/pre&gt; 

&lt;p&gt;&amp;#x5F53;&amp;#x4E24;&amp;#x4E2A;&amp;#x5173;&amp;#x8054;&amp;#x7684;&amp;#x8868;&amp;#x90FD;&amp;#x6709;&amp;#x76F8;&amp;#x5173;&amp;#x7684;&amp;#x5B57;&amp;#x6BB5;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x8FD9;&amp;#x5C31;&amp;#x4F1A;&amp;#x662F;&amp;#x95EE;&amp;#x9898;&amp;#x3002;&amp;#x6240;&amp;#x4EE5;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5E94;&amp;#x8BE5;&amp;#x5728;&lt;code&gt;Product&lt;/code&gt; &amp;#x6A21;&amp;#x578B;&amp;#x4ECE;&amp;#x65B0;&amp;#x5B9A;&amp;#x4E49;&amp;#x5E76;&amp;#x4E14;&amp;#x6307;&amp;#x5B9A;&amp;#x8868;&amp;#x540D;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x5C31;&amp;#x4E0D;&amp;#x600E;&amp;#x4E48;&amp;#x51FA;&amp;#x9519;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/product.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
def self.cheaper_than(price) 
  where(&amp;quot;products.price &amp;lt; ?&amp;quot;, price)
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x4E5F;&amp;#x5C31;&amp;#x662F;&amp;#x8BF4;&amp;#xFF0C;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x81EA;&amp;#x5DF1;&amp;#x5199;SQL&amp;#x6761;&amp;#x4EF6;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x4E3A;&amp;#x4E86;&amp;#x9632;&amp;#x6B62;&amp;#x4E0D;&amp;#x540C;&amp;#x7684;&amp;#x8868;&amp;#x4E4B;&amp;#x95F4;&amp;#x6709;&amp;#x91CD;&amp;#x590D;&amp;#x5B57;&amp;#x6BB5;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#x5C31;&amp;#x5E94;&amp;#x8BE5;&amp;#x5728;&amp;#x5173;&amp;#x8054;&amp;#x67E5;&amp;#x8BE2;&amp;#x4E2D;&amp;#x5199;&amp;#x660E;&amp;#x8868;&amp;#x540D;&amp;#x3002;&amp;#x5F53;&amp;#x7136;&amp;#x5982;&amp;#x679C;&amp;#x662F;&amp;#x6309;&amp;#x7167;Rails&amp;#x7684;&amp;#x54C8;&amp;#x5E0C;&amp;#x6761;&amp;#x4EF6;&amp;#x5199;&amp;#xFF0C;&amp;#x6BD4;&amp;#x5982;&amp;#x5728;scope&amp;#x91CC;&amp;#x6211;&amp;#x4EEC;&amp;#x5B9A;&amp;#x4E49;&amp;#x67E5;&amp;#x8BE2;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#x5C31;&amp;#x4E0D;&amp;#x8981;&amp;#x6211;&amp;#x4EEC;&amp;#x81EA;&amp;#x5DF1;&amp;#x6307;&amp;#x660E;&amp;#x5C5E;&amp;#x4E8E;&amp;#x54EA;&amp;#x4E2A;&amp;#x8868;&amp;#xFF0C;Rails&amp;#x4F1A;&amp;#x81EA;&amp;#x52A8;&amp;#x52A0;&amp;#x4E0A;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;&amp;#x901A;&amp;#x8FC7;Named Scopes&amp;#x521B;&amp;#x5EFA;&amp;#x8BB0;&amp;#x5F55;&lt;/h3&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;named scopes&amp;#x521B;&amp;#x5EFA;&amp;#x65B0;&amp;#x7684;&amp;#x8BB0;&amp;#x5F55;&amp;#xFF0C;&amp;#x4F8B;&amp;#x5982;&amp;#x5728;&lt;code&gt;Product&lt;/code&gt;&amp;#x6A21;&amp;#x578B;&amp;#x4E0A;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x53EB;discontinued&amp;#x7684;named scope&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt; Product.discontinued
 =&amp;gt; [#&amp;lt;Product id: 3, name: &amp;quot;Some DVD&amp;quot;, price: 13.49, discontinued: true, category_id: 1, created_at: &amp;quot;2010-05-25 19:45:05&amp;quot;, updated_at: &amp;quot;2010-05-25 19:45:05&amp;quot;&amp;gt;]
&lt;/pre&gt; 

&lt;p&gt;&amp;#x56E0;&amp;#x4E3A;named scope&amp;#x662F;&amp;#x7528;&amp;#x7684;Hash&amp;#x6240;&amp;#x4EE5;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x8C03;&amp;#x7528;&lt;code&gt;build&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x521B;&amp;#x5EFA;&lt;code&gt;discontinued&lt;/code&gt;&amp;#x5C5E;&amp;#x6027;&amp;#x4E3A;&amp;#x771F;&amp;#x7684;&amp;#x8BB0;&amp;#x5F55;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt; p = Product.discontinued.build
 =&amp;gt; #&amp;lt;Product id: nil, name: nil, price: nil, discontinued: true, category_id: nil, created_at: nil, updated_at: nil&amp;gt;
&lt;/pre&gt; 

&lt;p&gt;&amp;#x8FD9;&amp;#x79CD;&amp;#x521B;&amp;#x5EFA;&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x7C7B;&amp;#x4F3C;&amp;#x4E8E;&amp;#x901A;&amp;#x8FC7;Rails&amp;#x7684;&amp;#x5173;&amp;#x8054;&amp;#x65B9;&amp;#x5F0F;&amp;#x7684;&amp;#x521B;&amp;#x5EFA;&amp;#xFF08;&amp;#x8BD1;&amp;#x8005;&amp;#x6653;&amp;#x591C;&amp;#x6CE8;&amp;#xFF1A;&amp;#x4F8B;&amp;#x5982;has_many&amp;#x7684;&amp;#x5173;&amp;#x8054;&amp;#xFF09;&amp;#x8FD9;&amp;#x6837;&amp;#x9ED8;&amp;#x8BA4;&amp;#x7684;&amp;#x60C5;&amp;#x51B5;&amp;#x4E0B;&amp;#x5C31;&amp;#x4F1A;&amp;#x6709;&amp;#x4E00;&amp;#x4E9B;&amp;#x9650;&amp;#x5B9A;&amp;#x901A;&amp;#x8FC7;&amp;#x5916;&amp;#x952E;&amp;#x8BBE;&amp;#x7F6E;&amp;#x597D;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x901A;&amp;#x8FC7;scope&amp;#x521B;&amp;#x5EFA;&amp;#x8BB0;&amp;#x5F55;&amp;#x662F;&amp;#x7528;&amp;#x8FC7;where&amp;#x8BED;&amp;#x53E5;&amp;#x8FDB;&amp;#x884C;&amp;#x7684;&amp;#x9650;&amp;#x5B9A;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;Arel&lt;/h3&gt;

&lt;p&gt;&amp;#x6700;&amp;#x540E;&amp;#x6211;&amp;#x4EEC;&amp;#x4EE5;&lt;a href="http://github.com/rails/arel"&gt;Arel&lt;/a&gt;&amp;#x5BF9;&amp;#x7684;&amp;#x4ECB;&amp;#x7ECD;&amp;#x7ED3;&amp;#x675F;&amp;#x672C;&amp;#x6587;&amp;#x3002;Arel&amp;#x662F;&amp;#x4E00;&amp;#x79CD;&amp;#x7B80;&amp;#x5316;&amp;#x7684;&amp;#x68C0;&amp;#x7D22;&amp;#x65B9;&amp;#x5F0F;&amp;#xFF0C;&amp;#x5728;Rails 3&amp;#x4E2D;&amp;#x4F7F;&amp;#x7528;&amp;#x5F88;&amp;#x7B80;&amp;#x5355;&amp;#xFF0C;&amp;#x4F60;&amp;#x53EA;&amp;#x9700;&amp;#x8981;&amp;#x53D6;&amp;#x4E00;&amp;#x4E2A;model&amp;#x7684;&lt;code&gt;arel_table&lt;/code&gt;&amp;#x5C5E;&amp;#x6027;&amp;#x3002;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt; t = Product.arel_table
&lt;/pre&gt;

&lt;p&gt;&amp;#x53D8;&amp;#x91CF;t&amp;#x4EE3;&amp;#x8868;product&amp;#x8868;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x5982;&amp;#x4E0B;&amp;#x65B9;&amp;#x5F0F;&amp;#x8BBF;&amp;#x95EE;&amp;#x5B57;&amp;#x6BB5;&amp;#x5C5E;&amp;#x6027;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt;t[:price]
 =&amp;gt; &amp;lt;Attribute price&amp;gt;
&lt;/pre&gt; 

&lt;p&gt;&amp;#x901A;&amp;#x8FC7;&amp;#x5BF9;&amp;#x5C5E;&amp;#x6027;&amp;#x8C03;&amp;#x7528;&amp;#x65B9;&amp;#x6CD5;&amp;#x7B49;&amp;#x4E8E;&amp;#x6267;&amp;#x884C;&amp;#x6761;&amp;#x4EF6;&amp;#x67E5;&amp;#x8BE2;&amp;#xFF0C;&amp;#x4F8B;&amp;#x5982;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x627E;&amp;#x5230;&amp;#x4EF7;&amp;#x503C;&amp;#x4E3A;2.99&amp;#x7F8E;&amp;#x5143;&amp;#x7684;&amp;#x6240;&amp;#x6709;&amp;#x5546;&amp;#x54C1;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt; t[:price].eq(2.99)
 =&amp;gt; #&amp;lt;Arel::Predicates::Equality:0x1040dd9f0 @operand1=&amp;lt;Attribute price&amp;gt;, @operand2=2.99&amp;gt;
&lt;/pre&gt; 

&lt;p&gt;&amp;#x8FD9;&amp;#x5C06;&amp;#x8FD4;&amp;#x56DE;&amp;#x4E00;&amp;#x4E2A;predicate&amp;#x5BF9;&amp;#x8C61;&amp;#x4EE3;&amp;#x8868;&amp;#x7740;&amp;#x67E5;&amp;#x8BE2;&amp;#x6761;&amp;#x4EF6;&amp;#x3002;&amp;#x8FD8;&amp;#x6709;&amp;#x4E00;&amp;#x4E9B;&amp;#x5176;&amp;#x4ED6;&amp;#x6761;&amp;#x4EF6;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;&amp;#xFF0C;&amp;#x6BD4;&amp;#x5982;&lt;code&gt;matches&lt;/code&gt;&amp;#x4EE3;&amp;#x8868;Like&amp;#x67E5;&amp;#x8BE2;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&lt;code&gt;to_sql&lt;/code&gt;&amp;#x6765;&amp;#x67E5;&amp;#x770B;&amp;#x8FD9;&amp;#x4E2A;&amp;#x67E5;&amp;#x8BE2;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;sql&amp;#x8BED;&amp;#x53E5;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt; t[:name].matches(&amp;#x27;%lore&amp;#x27;).to_sql
 =&amp;gt; &amp;quot;\&amp;quot;products\&amp;quot;.\&amp;quot;name\&amp;quot; LIKE &amp;#x27;%lore&amp;#x27;&amp;quot;
&lt;/pre&gt; 

&lt;p&gt;&amp;#x540C;&amp;#x65F6;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;or&amp;#x65B9;&amp;#x6CD5;&amp;#x5C06;&amp;#x4E24;&amp;#x4E2A;predicate&amp;#x5BF9;&amp;#x8C61;&amp;#x8FDE;&amp;#x5728;&amp;#x4E00;&amp;#x8D77;&amp;#x8FDB;&amp;#x884C;&amp;#x7EC4;&amp;#x5408;&amp;#x67E5;&amp;#x8BE2;&amp;#xFF0C;&amp;#x6BD4;&amp;#x5982;&amp;#x67E5;&amp;#x8BE2;&amp;#x4EF7;&amp;#x503C;2.99&amp;#x7F8E;&amp;#x5143;&amp;#x6216;&amp;#x8005;&amp;#x4EA7;&amp;#x54C1;&amp;#x540D;&amp;#x662F;lore&amp;#x7684;&amp;#x4EA7;&amp;#x54C1;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
t[:price].eq(2.99).or(t[:name].matches(&amp;#x27;%lore&amp;#x27;))
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x5C06;&amp;#x751F;&amp;#x6210;&amp;#x5982;&amp;#x4E0B;Sql&amp;#x8BED;&amp;#x53E5;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&lt;code&gt;to_sql&lt;/code&gt;&amp;#x770B;&amp;#x5230;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt; t[:price].eq(2.99).or(t[:name].matches(&amp;#x27;%lore&amp;#x27;)).to_sql
 =&amp;gt; &amp;quot;(\&amp;quot;products\&amp;quot;.\&amp;quot;price\&amp;quot; = 2.99 OR \&amp;quot;products\&amp;quot;.\&amp;quot;name\&amp;quot; LIKE &amp;#x27;%lore&amp;#x27;)&amp;quot;
&lt;/pre&gt; 

&lt;p&gt;&amp;#x56E0;&amp;#x4E3A;predicate&amp;#x5BF9;&amp;#x8C61;&amp;#x5BF9;&amp;#x5E94;&amp;#x4E00;&amp;#x4E2A;&amp;#x67E5;&amp;#x8BE2;&amp;#x6761;&amp;#x4EF6;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x628A;predicate&amp;#x4F5C;&amp;#x4E3A;&amp;#x4E00;&amp;#x4E2A;&amp;#x53C2;&amp;#x6570;&amp;#x4F20;&amp;#x7ED9;ActiveRecord&amp;#x7684;where&amp;#x65B9;&amp;#x6CD5;&amp;#x3002;&amp;#x4F8B;&amp;#x5982;&amp;#x628A;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;predicate&amp;#x4F20;&amp;#x7ED9;&lt;code&gt;Product.where&lt;/code&gt;&amp;#xFF0C;&amp;#x5C31;&amp;#x4F1A;&amp;#x8FD4;&amp;#x56DE;&amp;#x4EF7;&amp;#x503C;&amp;#x662F;2.99&amp;#x7F8E;&amp;#x5143;&amp;#x6216;&amp;#x8005;&amp;#x540D;&amp;#x5B57;&amp;#x4EE5;lore&amp;#x7ED3;&amp;#x5C3E;&amp;#x7684;&amp;#x8BB0;&amp;#x5F55;&amp;#x96C6;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
&amp;gt;   Product.where(t[:price].eq(2.99).or(t[:name].matches(&amp;#x27;%lore&amp;#x27;)))
 =&amp;gt; [#&amp;lt;Product id: 2, name: &amp;quot;Milk&amp;quot;, price: 2.99, discontinued: nil, category_id: 2, created_at: &amp;quot;2010-05-24 21:02:38&amp;quot;, updated_at: &amp;quot;2010-05-24 21:02:38&amp;quot;&amp;gt;, #&amp;lt;Product id: 4, name: &amp;quot;Knight Lore&amp;quot;, price: 2.99, discontinued: nil, category_id: nil, created_at: &amp;quot;2010-05-26 19:36:02&amp;quot;, updated_at: &amp;quot;2010-05-26 19:36:02&amp;quot;&amp;gt;]
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x91CC;&amp;#x6211;&amp;#x4EEC;&amp;#x53EA;&amp;#x662F;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;Arel&amp;#x6700;&amp;#x57FA;&amp;#x672C;&amp;#x7684;&amp;#x77E5;&amp;#x8BC6;&amp;#x3002;&amp;#x5B9E;&amp;#x9645;&amp;#x4E0A;&amp;#xFF0C;Arel&amp;#x8FD8;&amp;#x53EF;&amp;#x4EE5;&amp;#x505A;&amp;#x66F4;&amp;#x591A;&amp;#x7684;&amp;#x4E8B;&amp;#x3002;&amp;#x73B0;&amp;#x5728;&amp;#x4E5F;&amp;#x6709;&amp;#x5F88;&amp;#x591A;&amp;#x57FA;&amp;#x4E8E;Arel&amp;#x7684;&amp;#x65B9;&amp;#x4FBF;&amp;#x7684;&amp;#x63D2;&amp;#x4EF6;&amp;#xFF0C;&amp;#x4F8B;&amp;#x5982;&lt;a href="http://metautonomo.us/projects/metawhere/"&gt;MetaWhere&lt;/a&gt;&amp;#xFF0C;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x63D0;&amp;#x4F9B;&amp;#x5982;&amp;#x4E0B;&amp;#x65B9;&amp;#x5F0F;&amp;#x67E5;&amp;#x8BE2;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="ruby"&gt;
Product.where(:price.eq =&amp;gt; 2.99, :name.matches =&amp;gt; &amp;#x27;%lore&amp;#x27;)
&lt;/pre&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x9700;&amp;#x8981;&amp;#x66F4;&amp;#x91C7;&amp;#x7528;&amp;#x7075;&amp;#x6D3B;&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x8FDB;&amp;#x884C;&amp;#x66F4;&amp;#x52A0;&amp;#x590D;&amp;#x6742;&amp;#x7684;&amp;#x67E5;&amp;#x8BE2;&amp;#xFF0C;&amp;#x4F60;&amp;#x53EF;&amp;#x4EE5;&amp;#x518D;&amp;#x8FDB;&amp;#x4E00;&amp;#x6B65;&amp;#x4E86;&amp;#x89E3;Arel&amp;#x548C;MetaWhere&amp;#x76F8;&amp;#x5173;&amp;#x7684;&amp;#x77E5;&amp;#x8BC6;&lt;/p&gt;</description>
      <pubDate>Mon, 13 Sep 2010 20:41:03 +0000</pubDate>
      <guid>http://cn.asciicasts.com/episodes/215-advanced-queries-in-rails-3</guid>
      <link>http://cn.asciicasts.com/episodes/215-advanced-queries-in-rails-3</link>
    </item>
    <item>
      <title>Customzing Devise</title>
      <description>&lt;p&gt;&amp;#x5728;&amp;#x4E0A;&amp;#x4E00;&amp;#x7BC7;&amp;#x7684;&amp;#x4ECB;&amp;#x7ECD;Devise&amp;#x3010;&lt;a href="http://railscasts.com/episodes/209-introducing-devise"&gt;&amp;#x89C6;&amp;#x9891;&lt;/a&gt;&amp;#xFF0C;&lt;a href="http://cn.asciicasts.com/episodes/209-introducing-devise"&gt;&amp;#x9605;&amp;#x8BFB;&lt;/a&gt;&amp;#x3011;&amp;#x4E2D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5DF2;&amp;#x7ECF;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;Rails&amp;#x5E94;&amp;#x7528;&amp;#x4E2D;&amp;#x642D;&amp;#x5EFA;&amp;#x548C;&amp;#x4F7F;&amp;#x7528;&lt;a href="http://github.com/plataformatec/devise"&gt;devise&lt;/a&gt;&amp;#x7684;&amp;#x57FA;&amp;#x672C;&amp;#x529F;&amp;#x80FD;&amp;#x4E86;&amp;#x3002;&amp;#x73B0;&amp;#x5728;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4ECE;&amp;#x4E0A;&amp;#x4E00;&amp;#x7BC7;&amp;#x4ECB;&amp;#x7ECD;&amp;#x7559;&amp;#x4E0B;&amp;#x6765;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#x5F00;&amp;#x59CB;&amp;#xFF0C;&amp;#x6765;&amp;#x9610;&amp;#x8FF0;&amp;#x5982;&amp;#x4F55;&amp;#x5B9A;&amp;#x5236;devise&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5728;&amp;#x4E0A;&amp;#x4E00;&amp;#x7BC7;&amp;#x7684;&amp;#x4ECB;&amp;#x7ECD;&amp;#x91CC;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5DF2;&amp;#x7ECF;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;rails&amp;#x9879;&amp;#x76EE;&amp;#x91CC;&amp;#x901A;&amp;#x8FC7;devise&amp;#x5F88;&amp;#x5BB9;&amp;#x6613;&amp;#x7684;&amp;#x6DFB;&amp;#x52A0;&amp;#x6CE8;&amp;#x518C;&amp;#xFF0C;&amp;#x767B;&amp;#x5F55;&amp;#x548C;&amp;#x9000;&amp;#x51FA;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#xFF1A;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/368/original/E210I01.png" width="800" height="327" alt="Our project management application."/&gt;
&lt;/div&gt;

&lt;h3&gt;&amp;#x8BBF;&amp;#x95EE;&amp;#x9650;&amp;#x5236;&lt;/h3&gt;

&lt;p&gt;&amp;#x63A5;&amp;#x4E0B;&amp;#x6765;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x5B9E;&amp;#x73B0;&amp;#x9650;&amp;#x5236;&amp;#x8BBF;&amp;#x95EE;&amp;#x3002;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD9;&amp;#x4E2A;&amp;#x5E94;&amp;#x7528;&amp;#x4E2D;&amp;#xFF08;&amp;#x8BD1;&amp;#x8005;&amp;#x6CE8;&amp;#xFF1A;&amp;#x6211;&amp;#x4EEC;&amp;#x5F00;&amp;#x53D1;&amp;#x7684;&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x9879;&amp;#x76EE;&amp;#x7BA1;&amp;#x7406;&amp;#x7CFB;&amp;#x7EDF;&amp;#xFF09;&amp;#xFF0C;&amp;#x5C31;&amp;#x662F;&amp;#x5BF9;&amp;#x4E8E;&amp;#x521B;&amp;#x5EFA;&amp;#xFF0C;&amp;#x4FEE;&amp;#x6539;&amp;#x548C;&amp;#x5220;&amp;#x9664;&amp;#x9879;&amp;#x76EE;&amp;#x8FDB;&amp;#x884C;&amp;#x6743;&amp;#x9650;&amp;#x63A7;&amp;#x5236;&amp;#xFF0C;&amp;#x53EA;&amp;#x6709;&amp;#x6CE8;&amp;#x518C;&amp;#x5E76;&amp;#x4E14;&amp;#x767B;&amp;#x5F55;&amp;#x7684;&amp;#x7528;&amp;#x6237;&amp;#x624D;&amp;#x80FD;&amp;#x6709;&amp;#x6743;&amp;#x64CD;&amp;#x4F5C;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x901A;&amp;#x8FC7;&amp;#x5728;&amp;#x4E2D;&lt;code&gt;ProjectsController&lt;/code&gt;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E2A;&lt;code&gt;before_filter&lt;/code&gt;&amp;#xFF0C;&amp;#x5728;&amp;#x5176;&amp;#x4E2D;&amp;#x8C03;&amp;#x7528;devise&amp;#x63D0;&amp;#x4F9B;&amp;#x7684;&amp;#x68C0;&amp;#x67E5;&amp;#x662F;&amp;#x5426;&amp;#x6388;&amp;#x6743;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&lt;code&gt;authenticate_user!&lt;/code&gt;&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&amp;#x65B9;&amp;#x6CD5;&amp;#x4F1A;&amp;#x68C0;&amp;#x67E5;Project&amp;#x4E0B;&amp;#x7684;&amp;#x6240;&amp;#x6709;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#xFF0C;&amp;#x7528;&amp;#x6237;&amp;#x6CA1;&amp;#x6709;&amp;#x767B;&amp;#x5F55;&amp;#x5E76;&amp;#x4E14;&amp;#x8BD5;&amp;#x56FE;&amp;#x8C03;&amp;#x7528;&amp;#x8BE5;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x5C31;&amp;#x4F1A;&amp;#x8DF3;&amp;#x8F6C;&amp;#x5230;&amp;#x767B;&amp;#x5F55;&amp;#x9875;&amp;#x9762;&amp;#x3002;&amp;#x7406;&amp;#x8BBA;&amp;#x4E0A;&amp;#x8BB2;&amp;#xFF0C;&amp;#x6CA1;&amp;#x6709;&amp;#x767B;&amp;#x5F55;&amp;#x7684;&amp;#x7528;&amp;#x6237;&amp;#x4E5F;&amp;#x5E94;&amp;#x8BE5;&amp;#x53EF;&amp;#x4EE5;&amp;#x8BBF;&amp;#x95EE;&lt;code&gt;index&lt;/code&gt;&amp;#x548C;&lt;code&gt;show&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x4E5F;&amp;#x5C31;&amp;#x662F;&amp;#x8BF4;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD8;&amp;#x5E94;&amp;#x8BE5;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E2A;&lt;code&gt;:except&lt;/code&gt;&amp;#x9009;&amp;#x9879;&amp;#x6765;&amp;#x4FDD;&amp;#x8BC1;&amp;#x7528;&amp;#x6237;&amp;#x53EF;&amp;#x4EE5;&amp;#x6B63;&amp;#x5E38;&amp;#x65B9;&amp;#x6CD5;&amp;#x4E0A;&amp;#x9762;&amp;#x4E24;&amp;#x4E2A;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/controllers/projects_controller.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class ProjectsController &amp;lt; ApplicationController  
    
  before_filter :authenticate_user!, :except =&amp;gt; [:show, :index]  
  
  def index  
    #rest of class  
&lt;/pre&gt;

&lt;p&gt;&amp;#x90A3;&amp;#x4E48;&amp;#x73B0;&amp;#x5728;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x70B9;&amp;#x51FB;&amp;ldquo;New Project&amp;rdquo;&amp;#x94FE;&amp;#x63A5;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD8;&amp;#x6CA1;&amp;#x6709;&amp;#x767B;&amp;#x5F55;&amp;#xFF0C;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;&amp;#x8BBF;&amp;#x95EE;&amp;#x9650;&amp;#x5236;&amp;#x5C31;&amp;#x4F1A;&amp;#x5176;&amp;#x4F5C;&amp;#x7528;&amp;#xFF0C;&amp;#x9875;&amp;#x9762;&amp;#x4F1A;&amp;#x8DF3;&amp;#x8F6C;&amp;#x5230;&amp;#x767B;&amp;#x5F55;&amp;#x9875;&amp;#x9762;&amp;#xFF1A;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/369/original/E210I02.png" width="801" height="475" alt="We&amp;rsquo;re redirected to the login page when we try to create a new project."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4EC5;&amp;#x4EC5;&amp;#x662F;&amp;#x7528;&amp;#x6765;&amp;#x5B9E;&amp;#x73B0;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x662F;&amp;#x5426;&amp;#x767B;&amp;#x5F55;&amp;#x7684;&amp;#x68C0;&amp;#x67E5;&amp;#xFF0C;&amp;#x90A3;devise&amp;#x5DF2;&amp;#x7ECF;&amp;#x53EF;&amp;#x4EE5;&amp;#x5F88;&amp;#x597D;&amp;#x5F88;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x5904;&amp;#x7406;&amp;#x4E86;&amp;#x3002;&amp;#x7136;&amp;#x800C;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x6388;&amp;#x6743;&amp;#x548C;&amp;#x8BBF;&amp;#x95EE;&amp;#x63A7;&amp;#x5236;&amp;#x5F88;&amp;#x590D;&amp;#x6742;&amp;#xFF08;&amp;#x8BD1;&amp;#x8005;&amp;#x6CE8;&amp;#xFF1A;&amp;#x591A;&amp;#x89D2;&amp;#x8272;&amp;#xFF0C;&amp;#x591A;&amp;#x7528;&amp;#x6237;&amp;#xFF0C;&amp;#x4EA4;&amp;#x53C9;&amp;#x6743;&amp;#x9650;&amp;#x7B49;&amp;#xFF09;&amp;#xFF0C;&amp;#x8FD9;&amp;#x65F6;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x989D;&amp;#x5916;&amp;#x7684;&amp;#x6388;&amp;#x6743;&amp;#x63A7;&amp;#x5236;&amp;#x7684;&amp;#x63D2;&amp;#x4EF6;&amp;#x6765;&amp;#x5B9E;&amp;#x73B0;&amp;#xFF0C;&amp;#x6BD4;&amp;#x5982;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x7B2C;192&amp;#x3010;&lt;a href="http://railscasts.com/episodes/192-authorization-with-cancan"&gt;&amp;#x89C6;&amp;#x9891;&lt;/a&gt;&amp;#xFF0C;&lt;a href="http://asciicasts.com/episodes/192-authorization-with-cancan"&gt;&amp;#x9605;&amp;#x8BFB;&lt;/a&gt;&amp;#x3011;&amp;#x4E2D;&amp;#x4ECB;&amp;#x7ECD;&amp;#x7684;CanCan&amp;#x4E00;&amp;#x8D77;&amp;#x4F7F;&amp;#x7528;&amp;#xFF0C;&amp;#x89E3;&amp;#x51B3;&amp;#x5B9E;&amp;#x9645;&amp;#x7684;&amp;#x4E1A;&amp;#x52A1;&amp;#x9700;&amp;#x6C42;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;&amp;#x5B9A;&amp;#x5236;Devise&amp;#x7684;&amp;#x9875;&amp;#x9762;&amp;#x663E;&amp;#x793A;&lt;/h3&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0A;209&amp;#x96C6;&amp;#x5C31;&amp;#x9057;&amp;#x7559;&amp;#x4E00;&amp;#x4E2A;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x5C31;&amp;#x662F;devise&amp;#x4F1A;&amp;#x81EA;&amp;#x52A8;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x751F;&amp;#x6210;&amp;#x6743;&amp;#x9650;&amp;#x7EF4;&amp;#x62A4;&amp;#x8FC7;&amp;#x7A0B;&amp;#x4E2D;&amp;#x7684;view&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x9875;&amp;#x9762;&amp;#x7684;&amp;#x98CE;&amp;#x683C;&amp;#x548C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x98CE;&amp;#x683C;&amp;#x4E00;&amp;#x81F4;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x5C31;&amp;#x9700;&amp;#x8981;&amp;#x81EA;&amp;#x5DF1;&amp;#x6765;&amp;#x5B9A;&amp;#x5236;&amp;#x663E;&amp;#x793A;&amp;#x4E86;&amp;#x3002;Devise&amp;#x4E5F;&amp;#x8003;&amp;#x8651;&amp;#x5230;&amp;#x4E86;&amp;#x8FD9;&amp;#x4E00;&amp;#x70B9;&amp;#xFF0C;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x5982;&amp;#x4E0B;&amp;#x9014;&amp;#x5F84;&amp;#x6765;&amp;#x89E3;&amp;#x51B3;&amp;#x8FD9;&amp;#x4E2A;&amp;#x95EE;&amp;#x9898;&amp;#x3002;&amp;#x56E0;&amp;#x4E3A;devise&amp;#x672C;&amp;#x8EAB;&amp;#x662F;&amp;#x57FA;&amp;#x4E8E;Rails&amp;#x5F15;&amp;#x64CE;&amp;#x7684;&amp;#xFF0C;&amp;#x53EA;&amp;#x8981;&amp;#x8986;&amp;#x76D6;&amp;#x539F;&amp;#x6765;&amp;#x7684;&amp;#x9875;&amp;#x9762;&amp;#xFF08;&amp;#x5B9E;&amp;#x9645;&amp;#x662F;override&amp;#x539F;&amp;#x6765;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF09;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x5B9E;&amp;#x73B0;&amp;#x5B9A;&amp;#x5236;&amp;#x7684;&amp;#x8981;&amp;#x6C42;&amp;#x4E86;&amp;#x3002;&amp;#x540C;&amp;#x65F6;devise&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B9;&amp;#x4FBF;&amp;#x7684;generate&amp;#x65B9;&amp;#x6CD5;&amp;#x7528;&amp;#x6765;&amp;#x751F;&amp;#x6210;&amp;#x8FD9;&amp;#x4E9B;&amp;#x7528;&amp;#x6765;&amp;#x91CD;&amp;#x8F7D;&amp;#x7684;&amp;#x9875;&amp;#x9762;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
$ rails generate devise_views
      create  app/views/devise
      create  app/views/devise/confirmations/new.html.erb
      create  app/views/devise/mailer/confirmation_instructions.html.erb
      create  app/views/devise/mailer/reset_password_instructions.html.erb
      create  app/views/devise/mailer/unlock_instructions.html.erb
      create  app/views/devise/passwords/edit.html.erb
      create  app/views/devise/passwords/new.html.erb
      create  app/views/devise/registrations/edit.html.erb
      create  app/views/devise/registrations/new.html.erb
      create  app/views/devise/sessions/new.html.erb
      create  app/views/devise/shared/_links.erb
      create  app/views/devise/unlocks/new.html.erb
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;&amp;#x547D;&amp;#x4EE4;&amp;#x590D;&amp;#x5236;&amp;#x4E86;&amp;#x6240;&amp;#x6709;devise&amp;#x4E2D;&amp;#x7684;&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x4E5F;&amp;#x5C31;&amp;#x662F;&amp;#x8BF4;&amp;#x6211;&amp;#x4EEC;&amp;#x53EA;&amp;#x8981;&amp;#x7F16;&amp;#x8F91;&amp;#x4FEE;&amp;#x6539;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x9875;&amp;#x9762;&amp;#x548C;&amp;#x6211;&amp;#x4EEC;&amp;#x539F;&amp;#x6765;&amp;#x7684;&amp;#x9879;&amp;#x76EE;&amp;#x98CE;&amp;#x683C;&amp;#x4E00;&amp;#x81F4;&amp;#x3002;&amp;#x5982;&amp;#x4E0B;&amp;#xFF0C;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x767B;&amp;#x5F55;&amp;#x9875;&amp;#x9762;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/devise/sessions/new.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;h2&amp;gt;Sign in&amp;lt;/h2&amp;gt;  
  
&amp;lt;%= form_for(resource_name, resource, :url =&amp;gt; session_path(resource_name)) do |f| %&amp;gt;  
  &amp;lt;p&amp;gt;&amp;lt;%= f.label :email %&amp;gt;&amp;lt;/p&amp;gt;  
  &amp;lt;p&amp;gt;&amp;lt;%= f.text_field :email %&amp;gt;&amp;lt;/p&amp;gt;  
  
  &amp;lt;p&amp;gt;&amp;lt;%= f.label :password %&amp;gt;&amp;lt;/p&amp;gt;  
  &amp;lt;p&amp;gt;&amp;lt;%= f.password_field :password %&amp;gt;&amp;lt;/p&amp;gt;  
  
  &amp;lt;% if devise_mapping.rememberable? -%&amp;gt;  
    &amp;lt;p&amp;gt;&amp;lt;%= f.check_box :remember_me %&amp;gt; &amp;lt;%= f.label :remember_me %&amp;gt;&amp;lt;/p&amp;gt;  
  &amp;lt;% end -%&amp;gt;  
  
  &amp;lt;p&amp;gt;&amp;lt;%= f.submit &amp;quot;Sign in&amp;quot; %&amp;gt;&amp;lt;/p&amp;gt;  
&amp;lt;% end %&amp;gt;  
  
&amp;lt;%= render :partial =&amp;gt; &amp;quot;devise/shared/links&amp;quot; %&amp;gt;  
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x4FEE;&amp;#x6539;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/devise/sessions/new.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;% title &amp;quot;Sign In&amp;quot; %&amp;gt;  
  
&amp;lt;%= form_for(resource_name, resource, :url =&amp;gt; session_path(resource_name)) do |f| %&amp;gt;  
  &amp;lt;ol class=&amp;quot;formList&amp;quot;&amp;gt;  
    &amp;lt;li&amp;gt;&amp;lt;%= f.label :email %&amp;gt; &amp;lt;%= f.text_field :email %&amp;gt;&amp;lt;/li&amp;gt;  
    &amp;lt;li&amp;gt;&amp;lt;%= f.label :password %&amp;gt; &amp;lt;%= f.password_field :password %&amp;gt;&amp;lt;/li&amp;gt;  
    &amp;lt;% if devise_mapping.rememberable? -%&amp;gt;  
    &amp;lt;li&amp;gt;&amp;lt;%= f.check_box :remember_me %&amp;gt; &amp;lt;%= f.label :remember_me %&amp;gt;&amp;lt;/li&amp;gt;  
    &amp;lt;% end %&amp;gt;  
    &amp;lt;li&amp;gt;&amp;lt;%= f.submit &amp;quot;Sign in&amp;quot; %&amp;gt;&amp;lt;/li&amp;gt;  
  &amp;lt;/ol&amp;gt;  
&amp;lt;% end %&amp;gt;  
&amp;lt;%= render :partial =&amp;gt; &amp;quot;devise/shared/links&amp;quot; %&amp;gt; 
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x4ECE;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x770B;&amp;#x5230;&amp;#x7528;&amp;#x5728;&amp;#x5B9A;&amp;#x5236;&amp;#x81EA;&amp;#x5DF1;&amp;#x9875;&amp;#x9762;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&lt;code&gt;title&lt;/code&gt;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#x66FF;&amp;#x6362;&amp;#x4E86;header&amp;#xFF0C;&amp;#x8FD9;&amp;#x79CD;&amp;#x4FEE;&amp;#x6539;&amp;#x9875;&amp;#x9762;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x7B2C;30&amp;#x96C6;&amp;#x3010;&lt;a href="http://railscasts.com/episodes/30-pretty-page-title"&gt;&amp;#x89C2;&amp;#x770B;&lt;/a&gt;&amp;#xFF0C;&lt;a href="http://asciicasts.com/episodes/30-pretty-page-title"&gt;&amp;#x9605;&amp;#x8BFB;&lt;/a&gt;&amp;#x3011;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x5982;&amp;#x4E0B;git gem&amp;#x6765;&amp;#x67E5;&amp;#x8BE2;&amp;#x76F8;&amp;#x5173;&lt;a href="http://github.com/ryanb/nifty-generators"&gt;nifty generators&lt;/a&gt;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD8;&amp;#x4FEE;&amp;#x6539;&amp;#x4E86;&amp;#xFF0C;&amp;#x9875;&amp;#x9762;&amp;#x7684;&amp;#x5E03;&amp;#x5C40;&amp;#x7528;ol&amp;#x6807;&amp;#x7B7E;&amp;#xFF0C;&amp;#x52A0;&amp;#x4E0A;&amp;#x4E00;&amp;#x4E2A;formlist&amp;#x7C7B;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;css&amp;#x5C31;&amp;#x5176;&amp;#x4F5C;&amp;#x7528;&amp;#xFF0C;&amp;#x539F;&amp;#x6765;&amp;#x7B80;&amp;#x5355;&amp;#x7684;devise&amp;#x7684;&amp;#x754C;&amp;#x9762;&amp;#xFF0C;&amp;#x5C31;&amp;#x80FD;&amp;#x591F;&amp;#x53D8;&amp;#x6210;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x7684;&amp;#x754C;&amp;#x9762;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/370/original/E210I03.png" width="800" height="394" alt="The customized sign in form."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x5176;&amp;#x5B83;&amp;#x7684;&amp;#x9875;&amp;#x9762;&amp;#x53EF;&amp;#x4EE5;&amp;#x8FDB;&amp;#x884C;&amp;#x540C;&amp;#x6837;&amp;#x7684;&amp;#x5904;&amp;#x7406;&amp;#xFF0C;&amp;#x4F7F;&amp;#x5F97;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x9875;&amp;#x9762;&amp;#x98CE;&amp;#x683C;&amp;#x4FDD;&amp;#x6301;&amp;#x4E00;&amp;#x81F4;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;&amp;#x5B9A;&amp;#x5236;&amp;#x9519;&amp;#x8BEF;&amp;#x63D0;&amp;#x793A;&amp;#x4FE1;&amp;#x606F;&lt;/h3&gt;

&lt;p&gt;Devise&amp;#x5904;&amp;#x7406;&amp;#x9519;&amp;#x8BEF;&amp;#x4FE1;&amp;#x606F;&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x662F;&amp;#x628A;&amp;#x6240;&amp;#x6709;&amp;#x9700;&amp;#x8981;&amp;#x7684;&amp;#x4FE1;&amp;#x606F;&amp;#x90FD;&amp;#x7528;i18n&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x4FDD;&amp;#x5B58;&amp;#x5728;config/local&amp;#x76EE;&amp;#x5F55;&amp;#x4E0B;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x5C31;&amp;#x5F88;&amp;#x5BB9;&amp;#x6613;&amp;#x4FEE;&amp;#x6539;&amp;#x548C;&amp;#x7FFB;&amp;#x8BD1;&amp;#x3002;&amp;#x6BD4;&amp;#x5982;&amp;#xFF0C;&amp;#x5F53;&amp;#x8F93;&amp;#x5165;&amp;#x4E86;&amp;#x9519;&amp;#x8BEF;&amp;#x7684;email&amp;#x548C;password&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x4F1A;&amp;#x63D0;&amp;#x793A;&amp;ldquo;invalid email or password&amp;rdquo;&amp;#x5982;&amp;#x679C;&amp;#x60F3;&amp;#x8981;&amp;#x4FEE;&amp;#x6539;&amp;#x8FD9;&amp;#x4E2A;&amp;#x9519;&amp;#x8BEF;&amp;#x63D0;&amp;#x793A;&amp;#xFF0C;&amp;#x53EA;&amp;#x9700;&amp;#x8981;&amp;#x4FEE;&amp;#x6539;&amp;#x5BF9;&amp;#x5E94;&amp;#x6587;&amp;#x4EF6;&amp;#x4E0B;&amp;#x7684;&lt;code&gt;devise.failure.invalid&lt;/code&gt;&amp;#x9519;&amp;#x8BEF;&amp;#x63D0;&amp;#x793A;&amp;#xFF1A;&lt;/p&gt;
 
&lt;p class="codeFilePath"&gt;/config/locales/devise.en.yml&lt;/p&gt;
&lt;pre class="ruby"&gt;
en:  
  errors:  
    messages:  
      not_found: &amp;quot;not found&amp;quot;  
      already_confirmed: &amp;quot;was already confirmed&amp;quot;  
      not_locked: &amp;quot;was not locked&amp;quot;  
  
  devise:  
    failure:  
      unauthenticated: &amp;#x27;You need to sign in or sign up before continuing.&amp;#x27;  
      unconfirmed: &amp;#x27;You have to confirm your account before continuing.&amp;#x27;  
      locked: &amp;#x27;Your account is locked.&amp;#x27;  
      invalid: &amp;#x27;OH NOES! ERROR IN TEH EMAIL!&amp;#x27;  
      invalid_token: &amp;#x27;Invalid authentication token.&amp;#x27;  
      timeout: &amp;#x27;Your session expired, please sign in again to continue.&amp;#x27;  
      inactive: &amp;#x27;Your account was not activated yet.&amp;#x27;  
    sessions:  
      signed_in: &amp;#x27;Signed in successfully.&amp;#x27;  
      signed_out: &amp;#x27;Signed out successfully.&amp;#x27;  
#rest of file omitted.  
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x65F6;&amp;#xFF0C;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x518D;&amp;#x767B;&amp;#x5F55;&amp;#x5E76;&amp;#x4E14;&amp;#x8F93;&amp;#x5165;&amp;#x9519;&amp;#x8BEF;&amp;#x7684;email&amp;#x5730;&amp;#x5740;&amp;#x65F6;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;#x6211;&amp;#x4EEC;&amp;#x4FEE;&amp;#x6539;&amp;#x7684;&amp;#x9519;&amp;#x8BEF;&amp;#x63D0;&amp;#x793A;&amp;#x4E86;&amp;#xFF1A;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/371/original/E210I04.png" width="800" height="430" alt="Our custom error message is now shown."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;&amp;#x662F;&amp;#x9519;&amp;#x8BEF;&amp;#x63D0;&amp;#x793A;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x5E0C;&amp;#x671B;&amp;#x4FEE;&amp;#x6539;validation&amp;#x7684;&amp;#x9A8C;&amp;#x8BC1;&amp;#x9519;&amp;#x8BEF;&amp;#x63D0;&amp;#x793A;&amp;#x5462;&amp;#xFF0C;&amp;#x6BD4;&amp;#x5982;&amp;#xFF0C;&amp;#x5728;&amp;#x6CE8;&amp;#x518C;&amp;#x8FC7;&amp;#x7A0B;&amp;#x4E2D;&amp;#x4E0D;&amp;#x7B26;&amp;#x5408;&amp;#x8981;&amp;#x6C42;&amp;#x7684;&amp;#x5B57;&amp;#x6BB5;&amp;#x63D0;&amp;#x793A;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/372/original/E210I05.png" width="800" height="558" alt="Devise&amp;rsquo;s default validation messages."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x9488;&amp;#x5BF9;validation Devise&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x914D;&amp;#x7F6E;&amp;#x6587;&amp;#x4EF6;&amp;#xFF0C;&amp;#x5728;&lt;code&gt;/config/initializers/devise.rb&lt;/code&gt;&amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x4FDD;&amp;#x5B58;&amp;#x4E86;&amp;#x5F88;&amp;#x591A;&amp;#x548C;devise&amp;#x76F8;&amp;#x5173;&amp;#x7684;&amp;#x914D;&amp;#x7F6E;&amp;#x4FE1;&amp;#x606F;&amp;#x3002;&amp;#x8FD9;&amp;#x4E9B;&amp;#x914D;&amp;#x7F6E;&amp;#x9009;&amp;#x9879;&amp;#x6709;&amp;#x5F88;&amp;#x597D;&amp;#x7684;&amp;#x6587;&amp;#x6863;&amp;#x6CE8;&amp;#x91CA;&amp;#xFF0C;&amp;#x4EE5;&amp;#x4FBF;&amp;#x5BB9;&amp;#x6613;&amp;#x627E;&amp;#x5230;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x9009;&amp;#x9879;&amp;#x5E76;&amp;#x4E14;&amp;#x505A;&amp;#x51FA;&amp;#x4FEE;&amp;#x6539;&amp;#x3002;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x60F3;&amp;#x8981;&amp;#x628A;&amp;#x53E3;&amp;#x4EE4;&amp;#x7684;&amp;#x6700;&amp;#x5C0F;&amp;#x957F;&amp;#x5EA6;&amp;#x4ECE;&amp;#x539F;&amp;#x6765;&amp;#x7684;6&amp;#x4F4D;&amp;#x51CF;&amp;#x5C11;&amp;#x5230;4&amp;#x4F4D;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x53EA;&amp;#x9700;&amp;#x8981;&amp;#x53BB;&amp;#x6389;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x6CE8;&amp;#x91CA;&amp;#xFF0C;&amp;#x5E76;&amp;#x4FEE;&amp;#x6539;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x914D;&amp;#x7F6E;&amp;#x9009;&amp;#x9879;&amp;#x3002;&amp;#x503C;&amp;#x5F97;&amp;#x6CE8;&amp;#x610F;&amp;#x7684;&amp;#x662F;&amp;#xFF0C;&amp;#x4FEE;&amp;#x6539;&amp;#x5B8C;&amp;#x914D;&amp;#x7F6E;&amp;#x6587;&amp;#x4EF6;&amp;#x540E;&amp;#xFF0C;&amp;#x9700;&amp;#x8981;&amp;#x91CD;&amp;#x542F;server&amp;#x624D;&amp;#x80FD;&amp;#x591F;&amp;#x52A0;&amp;#x8F7D;&amp;#x751F;&amp;#x6548;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/config/initalizers/devise.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
  # ==&amp;gt; Configuration for :validatable  
  # Range for password length  
  # config.password_length = 6..20  
&lt;/pre&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x9A8C;&amp;#x8BC1;&amp;#x4FE1;&amp;#x606F;&amp;#x66F4;&amp;#x590D;&amp;#x6742;&amp;#xFF0C;devise&amp;#x7684;&amp;#x9009;&amp;#x9879;&amp;#x6839;&amp;#x672C;&amp;#x6CA1;&amp;#x6709;&amp;#x529E;&amp;#x6CD5;&amp;#x6EE1;&amp;#x8DB3;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#x6211;&amp;#x4EEC;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x53BB;&amp;#x6389;devise&amp;#x7684;validatable&amp;#x6A21;&amp;#x5757;&amp;#xFF0C;&amp;#x5E76;&amp;#x4E14;&amp;#x81EA;&amp;#x5DF1;&amp;#x5728;User model&amp;#x4E2D;&amp;#x6DFB;&amp;#x52A0;&amp;#x81EA;&amp;#x5DF1;&amp;#x7684;&amp;#x9A8C;&amp;#x8BC1;&amp;#x4FE1;&amp;#x606F;&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x6765;&amp;#x6DFB;&amp;#x52A0;&amp;#x81EA;&amp;#x5DF1;&amp;#x7684;&amp;#x72EC;&amp;#x7279;&amp;#x5B9A;&amp;#x5236;&amp;#x9A8C;&amp;#x8BC1;&amp;#x4FE1;&amp;#x606F;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/user.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class User &amp;lt; ActiveRecord::Base  
   # Include default devise modules. Others available are:  
   # :token_authenticatable, :lockable, :timeoutable and :activatable  
   # :confirmable,  
   devise :database_authenticatable, :registerable,   
        :recoverable, :rememberable, :trackable, :validatable  
       
   # Setup accessible (or protected) attributes for your model  
   attr_accessible :email, :password, :password_confirmation  
end  
&lt;/pre&gt;


&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;#x5728;User&amp;#x7684;&amp;#x63CF;&amp;#x8FF0;&amp;#x4E2D;devise&amp;#x65B9;&amp;#x6CD5;&amp;#x6709;&amp;#x5F88;&amp;#x591A;&amp;#x53C2;&amp;#x6570;&amp;#xFF08;&amp;#x8BD1;&amp;#x8005;&amp;#x6CE8;&amp;#xFF1A;&amp;#x5C31;&amp;#x662F;devise&amp;#x7684;11&amp;#x4E2A;&amp;#x529F;&amp;#x80FD;&amp;#x6A21;&amp;#x5757;&amp;#x662F;&amp;#x5426;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;&amp;#x914D;&amp;#x7F6E;&amp;#x3002;&amp;#xFF09;&amp;#x5176;&amp;#x4E2D;&amp;#xFF0C;&lt;code&gt;:validatable&lt;/code&gt;&amp;#x5C31;&amp;#x662F;&amp;#x7528;&amp;#x6765;&amp;#x5B9E;&amp;#x73B0;&amp;#x6CE8;&amp;#x518C;&amp;#x8FC7;&amp;#x7A0B;&amp;#x7684;&amp;#x5B57;&amp;#x6BB5;&amp;#x9A8C;&amp;#x8BC1;&amp;#x7684;&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5E0C;&amp;#x671B;&amp;#x81EA;&amp;#x5DF1;&amp;#x5B9A;&amp;#x5236;&amp;#x8FD9;&amp;#x4E9B;&amp;#x5B57;&amp;#x6BB5;&amp;#x68C0;&amp;#x67E5;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x9700;&amp;#x8981;&amp;#x5148;&amp;#x53BB;&amp;#x6389;&amp;#x8FD9;&amp;#x4E2A;&lt;code&gt;:validatable&lt;/code&gt;&amp;#x7684;&amp;#x63CF;&amp;#x8FF0;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#xFF0C;&amp;#x5728;User&amp;#x4E2D;&amp;#x6DFB;&amp;#x52A0;&amp;#x81EA;&amp;#x5DF1;&amp;#x9700;&amp;#x8981;&amp;#x7684;&amp;#x5B57;&amp;#x6BB5;&amp;#x9A8C;&amp;#x8BC1;&amp;#xFF0C;&amp;#x867D;&amp;#x7136;&amp;#xFF0C;devise&amp;#x5141;&amp;#x8BB8;&amp;#x8FD9;&amp;#x6837;&amp;#x81EA;&amp;#x5DF1;&amp;#x5B9A;&amp;#x5236;&amp;#x3002;&amp;#x7136;&amp;#x540E;&amp;#xFF0C;&amp;#x5927;&amp;#x90E8;&amp;#x5206;&amp;#x7684;&amp;#x60C5;&amp;#x51B5;devise&amp;#x63D0;&amp;#x4F9B;&amp;#x7684;&amp;#x5B57;&amp;#x6BB5;&amp;#x9A8C;&amp;#x8BC1;&amp;#x5DF2;&amp;#x7ECF;&amp;#x53EF;&amp;#x4EE5;&amp;#x5904;&amp;#x7406;&lt;/p&gt;

&lt;h3&gt;&amp;#x8DEF;&amp;#x7531;&lt;/h3&gt;

&lt;p&gt;&amp;#x5B9A;&amp;#x5236;&amp;#x8DEF;&amp;#x7531;&amp;#xFF0C;&amp;#x662F;&amp;#x8BF4;&amp;#x4F8B;&amp;#x5982;devise&amp;#x9ED8;&amp;#x8BA4;&amp;#x6CE8;&amp;#x518C;&amp;#x9875;&amp;#x9762;&amp;#x5728;&lt;code&gt;/users/sign_up&lt;/code&gt;&amp;#x4F46;&amp;#x662F;&amp;#x6BD4;&amp;#x5982;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x60F3;&amp;#x8981;&amp;#x6539;&amp;#x5230;&lt;code&gt;/register&lt;/code&gt;&amp;#x3002;&amp;#x5B9E;&amp;#x9645;&amp;#x4E0A;&amp;#x9ED8;&amp;#x8BA4;&amp;#x7684;devise&amp;#x8DEF;&amp;#x7531;&amp;#x662F;&amp;#x901A;&amp;#x8FC7;router.rb&amp;#x4E2D;&amp;#x7684;&lt;code&gt;devise_for :users&lt;/code&gt;&amp;#x63D0;&amp;#x4F9B;&amp;#x7684;&amp;#x3002;&amp;#x5F53;&amp;#x7136;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E9B;&amp;#x8DEF;&amp;#x7531;devise&amp;#x4E5F;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x4FEE;&amp;#x6539;&amp;#x9014;&amp;#x5F84;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/config/routes.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
ProjectManage::Application.routes.draw do |map|  
  devise_for :users  
       
  resources :projects  
  root :to =&amp;gt; &amp;#x27;projects#index&amp;#x27;  
end  
&lt;/pre&gt;

&lt;p&gt;&amp;#x6BD4;&amp;#x5982;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;&amp;#x9700;&amp;#x6C42;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x6DFB;&amp;#x52A0;path_names&amp;#x7684;&amp;#x53C2;&amp;#x6570;&amp;#x8FBE;&amp;#x5230;&amp;#xFF0C;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/config/routes.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
ProjectManage::Application.routes.draw do |map|  
  devise_for :users, :path_names =&amp;gt; { :sign_up =&amp;gt; &amp;quot;register&amp;quot; }  
       
  resources :projects  
  root :to =&amp;gt; &amp;#x27;projects#index&amp;#x27;  
end  
&lt;/pre&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x5B8C;&amp;#x6210;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;&amp;#x4FEE;&amp;#x6539;&amp;#x4E4B;&amp;#x540E;&amp;#xFF0C;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x518D;&amp;#x8BD5;&amp;#x56FE;&amp;#x901A;&amp;#x8FC7;&lt;code&gt;/users/sign_up&lt;/code&gt;&amp;#x6765;&amp;#x6CE8;&amp;#x518C;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x5C31;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;#x6CA1;&amp;#x6709;&amp;#x8DEF;&amp;#x7531;&amp;#x7684;&amp;#x9519;&amp;#x8BEF;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;&amp;#x800C;&amp;#x901A;&amp;#x8FC7;&lt;code&gt;/users/register&lt;/code&gt;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x6B63;&amp;#x5E38;&amp;#x6CE8;&amp;#x518C;&amp;#x3002;&amp;#x5BF9;&amp;#x4E8E;devise_for&amp;#x7684;&amp;#x8DEF;&amp;#x7531;&amp;#x8FD8;&amp;#x6709;&amp;#x5F88;&amp;#x591A;&amp;#x5176;&amp;#x4ED6;&amp;#x7684;&amp;#x53C2;&amp;#x6570;&amp;#x6765;&amp;#x5E2E;&amp;#x52A9;&amp;#x5B9A;&amp;#x5236;&amp;#x8DEF;&amp;#x7531;&amp;#xFF0C;&amp;#x8FD9;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x53C2;&amp;#x8003;devise&amp;#x7684;&amp;#x6587;&amp;#x6863;&amp;#x5F97;&amp;#x5230;&amp;#x3002;&lt;/p&gt;


&lt;h3&gt;&amp;#x5B9A;&amp;#x5236;&amp;#x767B;&amp;#x5F55;&amp;#x4FE1;&amp;#x606F;&lt;/h3&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x524D;devise&amp;#x7684;&amp;#x914D;&amp;#x7F6E;&amp;#x662F;&amp;#x901A;&amp;#x8FC7;&amp;#x7528;&amp;#x6237;email&amp;#x548C;&amp;#x7528;&amp;#x6237;&amp;#x53E3;&amp;#x4EE4;&amp;#x767B;&amp;#x5F55;&amp;#x3002;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x5F88;&amp;#x53EF;&amp;#x80FD;&amp;#x6709;&amp;#x4E9B;&amp;#x9879;&amp;#x76EE;&amp;#x9700;&amp;#x8981;&amp;#x7528;&amp;#x7528;&amp;#x6237;&amp;#x540D;&amp;#x767B;&amp;#x5F55;&amp;#xFF0C;devise&amp;#x4E5F;&amp;#x8003;&amp;#x8651;&amp;#x5230;&amp;#x4E86;&amp;#x8FD9;&amp;#x70B9;&amp;#xFF0C;&amp;#x901A;&amp;#x8FC7;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x914D;&amp;#x7F6E;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x8F6C;&amp;#x6362;&amp;#x6210;&amp;#x7528;&amp;#x6237;&amp;#x540D;&amp;#x767B;&amp;#x5F55;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
$ rails generate migration add_username_to_users username:string
&lt;/pre&gt;

&lt;p&gt;&amp;#x9996;&amp;#x5148;&amp;#xFF0C;&amp;#x8981;&amp;#x7528;&amp;#x7528;&amp;#x6237;&amp;#x540D;&amp;#x767B;&amp;#x5F55;&amp;#x5C31;&amp;#x5F97;&amp;#x5148;&amp;#x589E;&amp;#x52A0;&amp;#x4E00;&amp;#x4E2A;username&amp;#x7684;&amp;#x5B57;&amp;#x6BB5;&lt;/p&gt;

&lt;pre class="terminal"&gt;
$ rake db:migrate
&lt;/pre&gt;

&lt;p&gt;&amp;#x56E0;&amp;#x4E3A;&amp;#x5F53;&amp;#x524D;&amp;#x6211;&amp;#x4EEC;&amp;#x53EA;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x7528;&amp;#x6237;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0D;&amp;#x7528;&amp;#x8C22;migrate&amp;#x53BB;&amp;#x5904;&amp;#x7406;&amp;#x4E4B;&amp;#x524D;&amp;#x6CA1;&amp;#x6709;username&amp;#x5B57;&amp;#x6BB5;&amp;#x7684;&amp;#x6570;&amp;#x636E;&amp;#xFF0C;&amp;#x53EA;&amp;#x8981;&amp;#x5728;&amp;#x63A7;&amp;#x5236;&amp;#x53F0;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x4FEE;&amp;#x6539;&amp;#x4E00;&amp;#x4E0B;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
$ rails c
Loading development environment (Rails 3.0.0.beta2)
ruby-1.8.7-p249 &amp;gt; User.first.update_attribute(:username, &amp;quot;eifion&amp;quot;)
 =&amp;gt; true
&lt;/pre&gt;

&lt;p&gt;&amp;#x4FEE;&amp;#x6539;&amp;#x5B8C;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#xFF0C;&amp;#x5DF2;&amp;#x7ECF;&amp;#x6709;&amp;#x767B;&amp;#x5F55;&amp;#x5B57;&amp;#x6BB5;&amp;#x4E86;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#x63A5;&amp;#x7740;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x4FEE;&amp;#x6539;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x914D;&amp;#x7F6E;&amp;#x6587;&amp;#x4EF6;/config/initializers/devise.rb&amp;#x6765;&amp;#x6307;&amp;#x660E;&amp;#x7528;&amp;#x4E0D;username&amp;#x767B;&amp;#x5F55;&amp;#x3002;&amp;#x5C31;&amp;#x662F;&amp;#x4FEE;&amp;#x6539;&lt;code&gt;config.authentication_keys&lt;/code&gt;&amp;#x628A; &lt;code&gt;:email&lt;/code&gt; &amp;#x53D8;&amp;#x6210; &lt;code&gt;:username&lt;/code&gt;&amp;#xFF1A;&lt;/p&gt;
 
&lt;p class="codeFilePath"&gt;/config/initializers/devise.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
config.authentication_keys = [ :username ]  
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;&amp;#x914D;&amp;#x7F6E;&amp;#x7684;&amp;#x4FEE;&amp;#x6539;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;username&amp;#x5B57;&amp;#x6BB5;&amp;#x6765;&amp;#x9A8C;&amp;#x8BC1;&amp;#x767B;&amp;#x5F55;&amp;#xFF0C;&amp;#x5F53;&amp;#x7136;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD8;&amp;#x5E94;&amp;#x8BE5;&amp;#x4FEE;&amp;#x6539;/app/views/devise/sessions/new.html.erb&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x4EE5;&amp;#x4FBF;&amp;#x8F93;&amp;#x5165;&amp;#x7684;&amp;#x5B57;&amp;#x6BB5;&amp;#x4E5F;&amp;#x4F7F;&amp;#x7528;&amp;#x7528;&amp;#x6237;&amp;#x540D;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/devise/sessions/new.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;% title &amp;quot;Sign In&amp;quot; %&amp;gt;  
&amp;lt;%= form_for(resource_name, resource, :url =&amp;gt; session_path(resource_name)) do |f| %&amp;gt;  
  &amp;lt;ol class=&amp;quot;formList&amp;quot;&amp;gt;  
    &amp;lt;li&amp;gt;&amp;lt;%= f.label :username %&amp;gt; &amp;lt;%= f.text_field :username %&amp;gt;&amp;lt;/li&amp;gt;  
    &amp;lt;li&amp;gt;&amp;lt;%= f.label :password %&amp;gt; &amp;lt;%= f.password_field :password %&amp;gt;&amp;lt;/li&amp;gt;  
    &amp;lt;% if devise_mapping.rememberable? -%&amp;gt;  
      &amp;lt;li&amp;gt;&amp;lt;%= f.check_box :remember_me %&amp;gt; &amp;lt;%= f.label :remember_me %&amp;gt;&amp;lt;/li&amp;gt;  
      &amp;lt;% end %&amp;gt;  
    &amp;lt;li&amp;gt;&amp;lt;%= f.submit &amp;quot;Sign in&amp;quot; %&amp;gt;&amp;lt;/li&amp;gt;  
  &amp;lt;/ol&amp;gt;  
&amp;lt;% end %&amp;gt;  
&amp;lt;%= render :partial =&amp;gt; &amp;quot;devise/shared/links&amp;quot; %&amp;gt; 
&lt;/pre&gt;
 
&lt;p&gt;&amp;#x6CE8;&amp;#x518C;&amp;#x9875;&amp;#x9762;&amp;#x7684;&amp;#x8868;&amp;#x5355;&amp;#x4E5F;&amp;#x9700;&amp;#x8981;&amp;#x8FDB;&amp;#x884C;&amp;#x76F8;&amp;#x5173;&amp;#x7684;&amp;#x4FEE;&amp;#x6539;&amp;#xFF0C;&amp;#x4EE5;&amp;#x4FBF;&amp;#x6CE8;&amp;#x518C;&amp;#x65F6;&amp;#x80FD;&amp;#x591F;&amp;#x6DFB;&amp;#x52A0;&amp;#x7528;&amp;#x6237;&amp;#x540D;&amp;#xFF0C;&amp;#x5F53;&amp;#x7136;&amp;#x5BF9;&amp;#x4E8E;&amp;#x7684;&amp;#x8F93;&amp;#x5165;&amp;#x7C7B;&amp;#x578B;&amp;#x9A8C;&amp;#x8BC1;&amp;#x4E5F;&amp;#x5E94;&amp;#x8BE5;&amp;#x5305;&amp;#x62EC;&amp;#x7528;&amp;#x6237;&amp;#x540D;&amp;#x3002;&amp;#x548C;&amp;#x767B;&amp;#x5F55;&amp;#x7684;&amp;#x8868;&amp;#x5355;&amp;#x7C7B;&amp;#x4F3C;&amp;#x5C31;&amp;#x4E0D;&amp;#x5C55;&amp;#x793A;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x5B8C;&amp;#x6210;&amp;#x4EE5;&amp;#x4E0A;&amp;#x7684;&amp;#x914D;&amp;#x7F6E;&amp;#x4FEE;&amp;#x6539;&amp;#x4E4B;&amp;#x540E;&amp;#xFF0C;&amp;#x91CD;&amp;#x542F;&amp;#x670D;&amp;#x52A1;&amp;#x5668;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x7528;&amp;#x6237;&amp;#x540D;&amp;#x767B;&amp;#x5F55;&amp;#x4E86;&amp;#xFF1A;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/373/original/E210I06.png" width="800" height="403" alt="We can now sign in with a username."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x5C31;&amp;#x662F;&amp;#x5B9A;&amp;#x5236;devise&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#x4E86;&amp;#xFF0C;&amp;#x901A;&amp;#x8FC7;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;&amp;#x4ECB;&amp;#x7ECD;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;Devise&amp;#x662F;&amp;#x4E2A;&amp;#x76F8;&amp;#x5F53;&amp;#x5B8C;&amp;#x5584;&amp;#x7684;Rails&amp;#x6743;&amp;#x9650;&amp;#x7BA1;&amp;#x7406;&amp;#x7CFB;&amp;#x7EDF;&amp;#xFF0C;&amp;#x65E2;&amp;#x6709;&amp;#x5F88;&amp;#x597D;&amp;#x7684;&amp;#x9ED8;&amp;#x8BA4;&amp;#x914D;&amp;#x7F6E;&amp;#xFF0C;&amp;#x4E5F;&amp;#x652F;&amp;#x6301;&amp;#x7075;&amp;#x6D3B;&amp;#x7684;&amp;#x5B9A;&amp;#x5236;&amp;#x3002;&lt;/p&gt;</description>
      <pubDate>Sun, 27 Jun 2010 18:55:48 +0000</pubDate>
      <guid>http://cn.asciicasts.com/episodes/210-customizing-devise</guid>
      <link>http://cn.asciicasts.com/episodes/210-customizing-devise</link>
    </item>
    <item>
      <title>Introducing Devise</title>
      <description>&lt;p&gt;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x4E4B;&amp;#x524D;&amp;#x7684;&amp;#x6587;&amp;#x7AE0;&amp;#x4E2D;&amp;#x6211;&amp;#x4EEC;&amp;#x5DF2;&amp;#x7ECF;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;&amp;#x4E00;&amp;#x4E9B;&amp;#x767B;&amp;#x5F55;&amp;#x548C;&amp;#x9A8C;&amp;#x8BC1;&amp;#x6388;&amp;#x6743;&amp;#x7684;&amp;#x89E3;&amp;#x51B3;&amp;#x65B9;&amp;#x6848;&amp;#xFF0C;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x6765;&amp;#x4ECB;&amp;#x7ECD;&amp;#x53E6;&amp;#x5916;&amp;#x4E00;&amp;#x4E2A;&amp;#x3002;&amp;#x6700;&amp;#x8FD1;&amp;#xFF0C;&amp;#x5728;ruby&amp;#x793E;&amp;#x533A;&lt;a href="http://github.com/plataformatec/devise"&gt;Devise&lt;/a&gt;&amp;#x8D8A;&amp;#x6765;&amp;#x8D8A;&amp;#x5E7F;&amp;#x6CDB;&amp;#x7684;&amp;#x88AB;&amp;#x91C7;&amp;#x7528;&amp;#x6765;&amp;#x89E3;&amp;#x51B3;&amp;#x7EF4;&amp;#x62A4;&amp;#x6743;&amp;#x9650;&amp;#x548C;&amp;#x9A8C;&amp;#x8BC1;&amp;#x3002;Devise&amp;#x6E90;&amp;#x4E8E;&lt;a href="http://github.com/hassox/warden"&gt;Warden&lt;/a&gt;&amp;#xFF0C;&amp;#x800C;warden&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;&amp;#x57FA;&amp;#x4E8E;Rack&amp;#x7684;&amp;#x9A8C;&amp;#x8BC1;&amp;#x6743;&amp;#x9650;gem&amp;#xFF0C;&amp;#x4E0D;&amp;#x8FC7;&amp;#xFF0C;&amp;#x4F7F;&amp;#x7528;devise&amp;#x5B9E;&amp;#x9645;&amp;#x5E76;&amp;#x4E0D;&amp;#x9700;&amp;#x8981;&amp;#x4EFB;&amp;#x4F55;&amp;#x5173;&amp;#x4E8E;warden&amp;#x7684;&amp;#x77E5;&amp;#x8BC6;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x4E4B;&amp;#x524D;&amp;#x6709;&amp;#x4E00;&amp;#x4E9B;&amp;#x5176;&amp;#x4ED6;&amp;#x7C7B;&amp;#x4F3C;&amp;#x7684;&amp;#x7EF4;&amp;#x62A4;&amp;#x9A8C;&amp;#x8BC1;&amp;#x6743;&amp;#x9650;&amp;#x529F;&amp;#x80FD;&amp;#x7684;gem&amp;#x7684;&amp;#x4F7F;&amp;#x7528;&amp;#x7ECF;&amp;#x9A8C;&amp;#x7684;&amp;#x8BDD;&amp;#xFF0C;&amp;#x4F60;&amp;#x4F1A;&amp;#x53D1;&amp;#x73B0;Devise&amp;#x7684;&amp;#x548C;&amp;#x4ED6;&amp;#x4EEC;&amp;#x7684;&amp;#x4E0D;&amp;#x540C;&amp;#x4E4B;&amp;#x5904;&amp;#x5728;&amp;#x4E8E;&amp;#xFF0C;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x4ECE;&amp;#x9875;&amp;#x9762;&amp;#x5230;model&amp;#x7684;&amp;#x5B9E;&amp;#x73B0;&amp;#x3002;&amp;#x76F8;&amp;#x6BD4;&amp;#x800C;&amp;#x8A00;&amp;#xFF0C;&amp;#x4F8B;&amp;#x5982;Authlogic&amp;#x5C31;&amp;#x53EA;&amp;#x5B9E;&amp;#x73B0;&amp;#x4E86;&amp;#x4E22;&amp;#x4E0E;model&amp;#x5C42;&amp;#x7684;&amp;#x5B9E;&amp;#x73B0;&amp;#xFF0C;&amp;#x8FD9;&amp;#x65F6;&amp;#x4F60;&amp;#x5C31;&amp;#x8981;&amp;#x81EA;&amp;#x5DF1;&amp;#x53BB;&amp;#x5904;&amp;#x7406;view&amp;#x5C42;&amp;#x5B9E;&amp;#x73B0;&amp;#x3002;&amp;#x800C;Devise&amp;#x662F;&amp;#x57FA;&amp;#x4E8E;Rails &amp;#x5F15;&amp;#x64CE;&amp;#x5F00;&amp;#x53D1;&amp;#x7684;&amp;#x6240;&amp;#x4EE5;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x540C;&amp;#x65F6;&amp;#x63D0;&amp;#x4F9B;controllers&amp;#x548C;view&amp;#x7684;&amp;#x5B9E;&amp;#x73B0;&amp;#x3002;&amp;#x4ECE;&amp;#x529F;&amp;#x80FD;&amp;#x89D2;&amp;#x5EA6;&amp;#x6765;&amp;#x770B;&amp;#xFF0C;Devise&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;11&amp;#x4E2A;&amp;#x65B9;&amp;#x9762;&amp;#x7684;&amp;#x5728;&amp;#x7EF4;&amp;#x62A4;&amp;#x548C;&amp;#x9A8C;&amp;#x8BC1;&amp;#x6743;&amp;#x9650;&amp;#x8FC7;&amp;#x7A0B;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x6A21;&amp;#x5757;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E9B;&amp;#x6A21;&amp;#x5757;&amp;#x90FD;&amp;#x662F;&amp;#x53EF;&amp;#x914D;&amp;#x7F6E;&amp;#x7684;&amp;#x3002;&amp;#x4F8B;&amp;#x5982;&amp;#xFF0C;&amp;#x5176;&amp;#x4E2D;Rememberable&amp;#x6A21;&amp;#x5757;&amp;#x662F;&amp;#x4F7F;&amp;#x7528;cookie&amp;#x4FDD;&amp;#x5B58;&amp;#x7528;&amp;#x6237;&amp;#x7684;&amp;#x767B;&amp;#x5F55;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;Recoverable&amp;#x662F;&amp;#x7528;&amp;#x6765;&amp;#x5904;&amp;#x7406;&amp;#x7528;&amp;#x6237;&amp;#x91CD;&amp;#x7F6E;&amp;#x53E3;&amp;#x4EE4;&amp;#x7684;&amp;#x3002;&amp;#x53EF;&amp;#x5B9A;&amp;#x5236;&amp;#x7684;&amp;#x6A21;&amp;#x5757;&amp;#x4F7F;&amp;#x7528;&amp;#x53EF;&amp;#x4EE5;&amp;#x5F88;&amp;#x5BB9;&amp;#x6613;&amp;#x7684;&amp;#x6839;&amp;#x636E;&amp;#x81EA;&amp;#x5DF1;&amp;#x7684;&amp;#x4E1A;&amp;#x52A1;&amp;#x9700;&amp;#x6C42;&amp;#x914D;&amp;#x7F6E;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x76F8;&amp;#x5E94;&amp;#x529F;&amp;#x80FD;&amp;#x6A21;&amp;#x5757;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;&amp;#x7ED9;&amp;#x9879;&amp;#x76EE;&amp;#x6DFB;&amp;#x52A0;&amp;#x6743;&amp;#x9650;&amp;#x9A8C;&amp;#x8BC1;&amp;#x7CFB;&amp;#x7EDF;&lt;/h3&gt;

&lt;p&gt;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x901A;&amp;#x8FC7;&amp;#x4E00;&amp;#x4E2A;&amp;#x5B9E;&amp;#x4F8B;&amp;#x6765;&amp;#x770B;&amp;#x770B;Devise&amp;#x662F;&amp;#x5728;&amp;#x9879;&amp;#x76EE;&amp;#x4E2D;&amp;#x662F;&amp;#x5982;&amp;#x4F55;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;&amp;#x3002;&amp;#x4E0B;&amp;#x9762;&amp;#x7684;&amp;#x622A;&amp;#x56FE;&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;&amp;#x7528;Rails3.0&amp;#x5199;&amp;#x7684;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x9879;&amp;#x76EE;&amp;#x7BA1;&amp;#x7406;&amp;#x5E94;&amp;#x7528;&amp;#x3002; Devise&amp;#x5C06;&amp;#x4F1A;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E2A;User model&amp;#x548C;&amp;#x63D0;&amp;#x4F9B;&amp;#x6743;&amp;#x9650;&amp;#x63A7;&amp;#x5236;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/361/original/E209I01.png" width="801" height="319" alt="Our project management application."/&gt;
&lt;/div&gt;

&lt;p&gt;Devise&amp;#x53EF;&amp;#x4EE5;&amp;#x5F88;&amp;#x597D;&amp;#x7684;&amp;#x652F;&amp;#x6301;Rails 3 &amp;#x548C;Rails 2.3 &amp;#x5728;&amp;#x4F4E;&amp;#x7684;&amp;#x7248;&amp;#x672C;&amp;#x5C31;&amp;#x4E0D;&amp;#x80FD;&amp;#x652F;&amp;#x6301;&amp;#x4E86;&amp;#x3002;&amp;#x800C;&amp;#x4E14;&amp;#xFF0C;&amp;#x9488;&amp;#x5BF9;&amp;#x4E0D;&amp;#x540C;&amp;#x7684;Rails&amp;#x7248;&amp;#x672C;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x9009;&amp;#x62E9;&amp;#x4E0D;&amp;#x540C;&amp;#x7684;devise&amp;#x7248;&amp;#x672C;&amp;#x3002;Rails 3&amp;#x9700;&amp;#x8981;&amp;#x5B89;&amp;#x88C5; Devise 1.1.rc0&amp;#xFF0C; &amp;#x800C;rails2.3&amp;#x9700;&amp;#x8981;1.0.6&amp;#x3002;&lt;/p&gt;


&lt;p&gt;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x9879;&amp;#x76EE;&amp;#x662F;Rails3&amp;#x7684;&amp;#x5C31;&amp;#x8981;&amp;#x5E94;&amp;#x8BE5;&amp;#x628A;devise &amp;#x7684;gem&amp;#x7248;&amp;#x672C;&amp;#x4FE1;&amp;#x606F;&amp;#x6CE8;&amp;#x660E;&amp;#x5230;gemfile&amp;#x91CC;&amp;#xFF0C;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/Gemfile&lt;/p&gt;
&lt;pre class="ruby"&gt;
gem &amp;#x27;devise&amp;#x27;, &amp;#x27;1.1.rc0&amp;#x27;  
&lt;/pre&gt;

&lt;p&gt;&amp;#x6709;&amp;#x4E86;&amp;#x8FD9;&amp;#x4E2A;&amp;#x58F0;&amp;#x660E;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;bundle&amp;#x6765;&amp;#x5B89;&amp;#x88C5;&amp;#x9700;&amp;#x8981;&amp;#x7684;gem&amp;#x548C;gem&amp;#x9700;&amp;#x8981;&amp;#x7684;&amp;#x4F9D;&amp;#x8D56;&amp;#x5305;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
bundle install
&lt;/pre&gt;

&lt;p&gt;&amp;#x63A5;&amp;#x4E0B;&amp;#x6765;&amp;#x4E00;&amp;#x6B65;&amp;#x662F;&amp;#x901A;&amp;#x8FC7;generate&amp;#x5B89;&amp;#x88C5;devise&amp;#x76F8;&amp;#x5173;&amp;#x4EE3;&amp;#x7801;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
$ rails generate devise_install
      create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
 
===============================================================================
 
Some setup you must do manually if you haven&amp;#x27;t yet:
 
  1. Setup default url options for your specific environment. Here is an
     example of development environment:
 
       config.action_mailer.default_url_options = { :host =&amp;gt; &amp;#x27;localhost:3000&amp;#x27; }
 
     This is a required Rails configuration. In production is must be the
     actual host of your application
 
  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:
 
       root :to =&amp;gt; &amp;quot;home#index&amp;quot;
 
===============================================================================
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD0;&amp;#x884C;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;&amp;#x547D;&amp;#x4EE4;&amp;#x4F1A;&amp;#x4EA7;&amp;#x751F;&amp;#x4E00;&amp;#x4E9B;&amp;#x6587;&amp;#x4EF6;&amp;#xFF0C;&amp;#x5305;&amp;#x62EC;config initializer&amp;#x4E0B;&amp;#x7684;&amp;#x521D;&amp;#x59CB;&amp;#x5316;devise&amp;#x6587;&amp;#x4EF6;&amp;#xFF0C;&amp;#x548C;config/local&amp;#x4E0B;&amp;#x7684;i18n&amp;#x663E;&amp;#x793A;&amp;#x6D88;&amp;#x606F;&amp;#x8F93;&amp;#x51FA;&amp;#x7684;&amp;#x6587;&amp;#x4EF6;&amp;#x3002;&amp;#x4E0B;&amp;#x9762;&amp;#x63D0;&amp;#x793A;&amp;#x7684;&amp;#x662F;&amp;#x4E24;&amp;#x4E2A;&amp;#x9700;&amp;#x8981;&amp;#x624B;&amp;#x52A8;&amp;#x6267;&amp;#x884C;&amp;#x7684;&amp;#x64CD;&amp;#x4F5C;&amp;#xFF0C;&amp;#x4E00;&amp;#x4E2A;&amp;#x662F;&amp;#x4E3A;&amp;#x5E94;&amp;#x7528;&amp;#x914D;&amp;#x7F6E;email host&amp;#x3002;&amp;#x53E6;&amp;#x5916;&amp;#xFF0C;&amp;#x4E00;&amp;#x4E2A;&amp;#x662F;&amp;#x5728;route&amp;#x4E0B;&amp;#x914D;&amp;#x7F6E;root&amp;#x7684;&amp;#x8DEF;&amp;#x7531;&amp;#x3002;&amp;#x6F14;&amp;#x793A;&amp;#x9879;&amp;#x76EE;&amp;#x4E2D;&amp;#x9ED8;&amp;#x8BA4;&amp;#x7684;&amp;#x6839;&amp;#x8DEF;&amp;#x7531;&amp;#x5DF2;&amp;#x7ECF;&amp;#x914D;&amp;#x7F6E;&amp;#x4E86;&amp;#xFF0C;&amp;#x5C31;&amp;#x4E0D;&amp;#x7528;&amp;#x518D;&amp;#x914D;&amp;#x3002;&amp;#x4F46;devise&amp;#x53D1;&amp;#x90AE;&amp;#x4EF6;&amp;#x7528;email&amp;#x7684;&amp;#x4E3B;&amp;#x673A;&amp;#x8FD8;&amp;#x9700;&amp;#x8981;&amp;#x914D;&amp;#x7F6E;&amp;#xFF0C;&amp;#x4E5F;&amp;#x5F88;&amp;#x7B80;&amp;#x5355;&amp;#x56E0;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x662F;&amp;#x5F00;&amp;#x53D1;&amp;#x73AF;&amp;#x5883;&amp;#xFF0C;&amp;#x76F4;&amp;#x63A5;&amp;#x62F7;&amp;#x8D1D;&amp;#x63D0;&amp;#x793A;&amp;#x5C31;&amp;#x884C;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/config/environments/development.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
config.action_mailer.default_url_options = { :host =&amp;gt; &amp;#x27;localhost:3000&amp;#x27; }  
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;&amp;#x914D;&amp;#x7F6E;&amp;#x7684;&amp;#x610F;&amp;#x601D;&amp;#x4F3C;&amp;#x4E4E;&amp;#x628A;localhost&amp;#x505A;&amp;#x4E3A;&amp;#x63A5;&amp;#x53D1;&amp;#x90AE;&amp;#x4EF6;&amp;#x7684;&amp;#x4E3B;&amp;#x673A;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#xFF0C;&amp;#x9879;&amp;#x76EE;&amp;#x4E0A;&amp;#x7EBF;&amp;#xFF0C;&amp;#x5728;&amp;#x751F;&amp;#x4EA7;&amp;#x73AF;&amp;#x5883;&amp;#x5C31;&amp;#x9700;&amp;#x8981;&amp;#x5728;production&amp;#x4E2D;&amp;#x628A;action_mailer&amp;#x7684;host&amp;#x914D;&amp;#x7F6E;&amp;#x6210;&amp;#x57DF;&amp;#x540D;&amp;#x3002;&lt;/p&gt;


&lt;h3&gt;&amp;#x751F;&amp;#x6210;devise&amp;#x7684;User Model&lt;/h3&gt;

&lt;p&gt;Devise&amp;#x4F1A;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;User&lt;/code&gt; Model&amp;#x6765;&amp;#x63A7;&amp;#x5236;&amp;#x548C;&amp;#x6743;&amp;#x9650;&amp;#xFF0C;&amp;#x800C;&amp;#x4E14;&amp;#xFF0C;Devise&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;generator&amp;#x6765;&amp;#x751F;&amp;#x4EA7;User Model, &amp;#x5F53;&amp;#x7136;&amp;#x8FD9;&amp;#x4E2A;generato&amp;#x53EA;&amp;#x662F;&amp;#x8282;&amp;#x7701;&amp;#x65F6;&amp;#x95F4;&amp;#xFF0C;&amp;#x5E76;&amp;#x4E0D;&amp;#x662F;&amp;#x5FC5;&amp;#x987B;&amp;#x8FD0;&amp;#x884C;&amp;#x7684;&amp;#xFF0C;&amp;#x624B;&amp;#x52A8;&amp;#x751F;&amp;#x6210;User model&amp;#x5B8C;&amp;#x5168;&amp;#x53EF;&amp;#x4EE5;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
$ rails generate devise User
      invoke  active_record
      create    app/models/user.rb
      invoke    test_unit
      create      test/unit/user_test.rb
      create      test/fixtures/users.yml
      inject  app/models/user.rb
      create  db/migrate/20100412200407_devise_create_users.rb
       route  devise_for :users
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD0;&amp;#x884C;generator&amp;#x4F1A;&amp;#x751F;&amp;#x6210;&amp;#x4E00;&amp;#x4E2A;model&amp;#x6587;&amp;#x4EF6;&amp;#xFF0C;&amp;#x4E00;&amp;#x4E2A;migration&amp;#x6587;&amp;#x4EF6;&amp;#x548C;&amp;#x4E00;&amp;#x4E2A;&lt;code&gt;devise_for&lt;/code&gt;&amp;#x7684;&amp;#x8DEF;&amp;#x7531;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0B;&amp;#x9762;&amp;#x5C06;&amp;#x4E00;&amp;#x4E2A;&amp;#x4E00;&amp;#x4E2A;&amp;#x6765;&amp;#x770B;&amp;#x770B;&amp;#x8FD9;&amp;#x4E9B;&amp;#x6587;&amp;#x4EF6;&amp;#x7684;&amp;#x4F5C;&amp;#x7528;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x4E0B;&amp;#x9762;&amp;#x662F;generator&amp;#x751F;&amp;#x6210;&amp;#x7684;User Model&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/models/user.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class User &amp;lt; ActiveRecord::Base  
  # Include default devise modules. Others available are:  
  # :token_authenticatable, :lockable, :timeoutable and :activatable  
  # :confirmable  
  devise :database_authenticatable, :registerable,   
         :recoverable, :rememberable, :trackable, :validatable  
  
  # Setup accessible (or protected) attributes for your model  
  attr_accessible :email, :password, :password_confirmation  
end  
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&lt;code&gt;User&lt;/code&gt; model&amp;#x548C;&amp;#x666E;&amp;#x901A;&amp;#x7684;ActiveRecord&amp;#x7684;&amp;#x533A;&amp;#x522B;&amp;#x5E76;&amp;#x4E0D;&amp;#x5927;&amp;#xFF0C;&amp;#x4E3B;&amp;#x8981;&amp;#x7684;&amp;#x5DEE;&amp;#x522B;&amp;#x662F;&amp;#x8C03;&amp;#x7528;&amp;#x4E86;&lt;code&gt;devise&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x5F53;&amp;#x7136;&amp;#x8FD9;&amp;#x4E5F;&amp;#x662F;&amp;#x914D;&amp;#x7F6E;&amp;#x7684;&amp;#x5173;&amp;#x952E;&amp;#x3002;Devise&amp;#x65B9;&amp;#x6CD5;&amp;#x6709;&amp;#x5F88;&amp;#x591A;&amp;#x7684;&amp;#x53C2;&amp;#x6570;&amp;#x7528;&amp;#x6765;&amp;#x6807;&amp;#x8BC6;&amp;#x662F;&amp;#x5426;&amp;#x4F7F;&amp;#x7528;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x6A21;&amp;#x5757;&amp;#x3002;&amp;#x6BD4;&amp;#x5982;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x524D;&amp;#x6587;&amp;#x8BF4;&amp;#x8FC7;&amp;#x7684;&lt;code&gt;:rememberable&lt;/code&gt;&amp;#x548C;&lt;code&gt;:recoverable&lt;/code&gt;&amp;#x529F;&amp;#x80FD;&amp;#x6A21;&amp;#x5757;&amp;#x3002;&amp;#x6240;&amp;#x4EE5;&amp;#xFF0C;&amp;#x6B63;&amp;#x5982;&amp;#x6211;&amp;#x4EEC;&amp;#x770B;&amp;#x5230;&amp;#x7684;&amp;#xFF0C;devise&amp;#x5C31;&amp;#x662F;&amp;#x7528;&amp;#x8FD9;&amp;#x6837;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x6765;&amp;#x914D;&amp;#x7F6E;&amp;#x662F;&amp;#x5426;&amp;#x4F7F;&amp;#x7528;&amp;#x76F8;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x6A21;&amp;#x5757;&amp;#x3002;&amp;#x5C31;&amp;#x662F;&amp;#x8BF4;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0D;&amp;#x60F3;&amp;#x8981;&amp;#x786E;&amp;#x8BA4;password&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EA;&amp;#x662F;&amp;#x9700;&amp;#x8981;&amp;#x628A;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&lt;code&gt;:confirmable&lt;/code&gt;&amp;#x4ECE;&amp;#x8FD9;&amp;#x91CC;&amp;#x5220;&amp;#x9664;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x540C;&amp;#x65F6;&amp;#xFF0C;&lt;code&gt;User&lt;/code&gt;&amp;#x7C7B;&amp;#x4E2D;&amp;#x8FD8;&amp;#x6709;&lt;code&gt;attr_accessible&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x662F;&amp;#x7528;&amp;#x6765;&amp;#x63CF;&amp;#x8FF0;&amp;#x53EF;&amp;#x80FD;&amp;#x7528;&amp;#x5230;&amp;#x7684;User&amp;#x8868;&amp;#x5B57;&amp;#x6BB5;&amp;#x3002;&amp;#x4E5F;&amp;#x5C31;&amp;#x662F;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x5728;Model&amp;#x4EE5;&amp;#x4E3A;&amp;#x4F7F;&amp;#x7528;&amp;#x8FD9;&amp;#x4E2A;&amp;#x5C5E;&amp;#x6027;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x5C31;&amp;#x8981;&amp;#x6807;&amp;#x8BC6;&amp;#x6E05;&amp;#x695A;&amp;#x662F;&amp;#x5426;&amp;#x9700;&amp;#x8981;&amp;#x53EA;&amp;#x8BFB;&amp;#x8FD8;&amp;#x662F;&amp;#x8BFB;&amp;#x5199;&amp;#x6743;&amp;#x9650;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x63A5;&amp;#x4E0B;&amp;#x6765;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x770B;&amp;#x770B;&amp;#x751F;&amp;#x4EA7;&amp;#x7684;migration&amp;#x6587;&amp;#x4EF6;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="ruby"&gt;
class DeviseCreateUsers &amp;lt; ActiveRecord::Migration  
  def self.up  
    create_table(:users) do |t|  
      t.database_authenticatable :null =&amp;gt; false  
      # t.confirmable  
      t.recoverable  
      t.rememberable  
      t.trackable  
      # t.lockable :lock_strategy =&amp;gt; :failed_attempts, :unlock_strategy =&amp;gt; :both  
  
      t.timestamps  
    end  
  
    add_index :users, :email,                :unique =&amp;gt; true  
    # add_index :users, :confirmation_token,   :unique =&amp;gt; true  
    add_index :users, :reset_password_token, :unique =&amp;gt; true  
    # add_index :users, :unlock_token,         :unique =&amp;gt; true  
  end  
  
  def self.down  
    drop_table :users  
  end  
end  
&lt;/pre&gt; 

&lt;p&gt;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x7684;migration&amp;#x6587;&amp;#x4EF6;&amp;#x5C31;&amp;#x5F88;&amp;#x5BB9;&amp;#x6613;&amp;#x7406;&amp;#x89E3;&amp;#x4E86;&amp;#xFF0C;&amp;#x548C;&amp;#x666E;&amp;#x901A;&amp;#x7684;migration&amp;#x6587;&amp;#x4EF6;&amp;#x5B8C;&amp;#x5168;&amp;#x76F8;&amp;#x540C;&amp;#xFF0C;&amp;#x6807;&amp;#x8BC6;user&amp;#x90FD;&amp;#x4F1A;&amp;#x6709;&amp;#x4EC0;&amp;#x4E48;&amp;#x5B57;&amp;#x6BB5;&amp;#x3002;&amp;#x503C;&amp;#x5F97;&amp;#x4E00;&amp;#x63D0;&amp;#x7684;&amp;#x662F;&amp;#xFF0C;&amp;#x8868;&amp;#x7684;&amp;#x5B57;&amp;#x6BB5;&amp;#x548C;&amp;#x6211;&amp;#x4EEC;&amp;#x521A;&amp;#x624D;&amp;#x7684;&amp;#x914D;&amp;#x7F6E;&amp;#x4E5F;&amp;#x6709;&amp;#x5173;&amp;#x7CFB;&amp;#x5C31;&amp;#x662F;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x6CA1;&amp;#x6709;&amp;#x914D;&amp;#x7F6E;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x6A21;&amp;#x5757;&amp;#xFF0C;&amp;#x4E5F;&amp;#x5C31;&amp;#x5E94;&amp;#x8BE5;&amp;#x5220;&amp;#x9664;&amp;#x76F8;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x5B57;&amp;#x6BB5;&amp;#xFF0C;&amp;#x548C;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x7D22;&amp;#x5F15;&amp;#x3002;
&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x4FEE;&amp;#x6539;&amp;#x5B8C;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x7684;migration&amp;#x6587;&amp;#x4EF6;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x6267;&amp;#x884C;migration&amp;#x771F;&amp;#x6B63;&amp;#x751F;&amp;#x6210;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x7ED3;&amp;#x6784;&amp;#x3002;&amp;#x901A;&amp;#x8FC7;&amp;#x8FD0;&amp;#x884C;&amp;#x4E0B;&amp;#x9762;&amp;#x547D;&amp;#x4EE4;&amp;#x751F;&amp;#x6210;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
rake db:migrate
&lt;/pre&gt;
 
&lt;p&gt;&amp;#x63A5;&amp;#x4E0B;&amp;#x6765;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x770B;&amp;#x770B;generator&amp;#x5728;router.rb&amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#x7684;&lt;code&gt;devise_for&lt;/code&gt;&amp;#x90FD;&amp;#x4EA7;&amp;#x751F;&amp;#x4E86;&amp;#x4EC0;&amp;#x4E48;&amp;#x8DEF;&amp;#x7531;.&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;rake 
routes&amp;#x67E5;&amp;#x770B;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
    new_user_session   GET    /users/sign_in                 {:controller=&amp;gt;&amp;quot;devise/sessions&amp;quot;, :action=&amp;gt;&amp;quot;new&amp;quot;}
          user_session POST   /users/sign_in                 {:controller=&amp;gt;&amp;quot;devise/sessions&amp;quot;, :action=&amp;gt;&amp;quot;create&amp;quot;}
  destroy_user_session GET    /users/sign_out                {:controller=&amp;gt;&amp;quot;devise/sessions&amp;quot;, :action=&amp;gt;&amp;quot;destroy&amp;quot;}
                       POST   /users/password(.:format)      {:controller=&amp;gt;&amp;quot;devise/passwords&amp;quot;, :action=&amp;gt;&amp;quot;create&amp;quot;}
         user_password PUT    /users/password(.:format)      {:controller=&amp;gt;&amp;quot;devise/passwords&amp;quot;, :action=&amp;gt;&amp;quot;update&amp;quot;}
     new_user_password GET    /users/password/new(.:format)  {:controller=&amp;gt;&amp;quot;devise/passwords&amp;quot;, :action=&amp;gt;&amp;quot;new&amp;quot;}
    edit_user_password GET    /users/password/edit(.:format) {:controller=&amp;gt;&amp;quot;devise/passwords&amp;quot;, :action=&amp;gt;&amp;quot;edit&amp;quot;}
                       POST   /users(.:format)               {:controller=&amp;gt;&amp;quot;devise/registrations&amp;quot;, :action=&amp;gt;&amp;quot;create&amp;quot;}
                       PUT    /users(.:format)               {:controller=&amp;gt;&amp;quot;devise/registrations&amp;quot;, :action=&amp;gt;&amp;quot;update&amp;quot;}
     user_registration DELETE /users(.:format)               {:controller=&amp;gt;&amp;quot;devise/registrations&amp;quot;, :action=&amp;gt;&amp;quot;destroy&amp;quot;}
 new_user_registration GET    /users/sign_up(.:format)       {:controller=&amp;gt;&amp;quot;devise/registrations&amp;quot;, :action=&amp;gt;&amp;quot;new&amp;quot;}
edit_user_registration GET    /users/edit(.:format)          {:controller=&amp;gt;&amp;quot;devise/registrations&amp;quot;, :action=&amp;gt;&amp;quot;edit&amp;quot;}
&lt;/pre&gt; 

&lt;p&gt;&amp;#x7A0D;&amp;#x5FAE;&amp;#x6709;&amp;#x70B9;&amp;#x4E71;&amp;#xFF0C;&amp;#x5F53;&amp;#x7136;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD8;&amp;#x662F;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x51FA;&amp;#x6765;&amp;#xFF0C;&amp;#x4EA7;&amp;#x751F;&amp;#x4E86;&amp;#x5982;&amp;#x4E0B;&amp;#x8DEF;&amp;#x7531;&amp;#xFF1A;&amp;#x767B;&amp;#x5F55;&amp;#xFF0C;&amp;#x767B;&amp;#x51FA;&amp;#xFF0C;&amp;#x91CD;&amp;#x7F6E;&amp;#x5BC6;&amp;#x7801;&amp;#xFF0C;&amp;#x6CE8;&amp;#x518C;&amp;#xFF0C;&amp;#x548C;&amp;#x4FEE;&amp;#x6539;&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#xFF0C;&amp;#x6240;&amp;#x6709;&amp;#x8FD9;&amp;#x4E9B;&amp;#x8DEF;&amp;#x7531;&amp;#x90FD;&amp;#x662F;&amp;#x53EF;&amp;#x4EE5;&amp;#x914D;&amp;#x7F6E;&amp;#x7684;&amp;#x3002;
&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x6709;&amp;#x4E86;&amp;#x8FD9;&amp;#x4E9B;&amp;#x8DEF;&amp;#x7531;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x5236;&amp;#x5B9A;&amp;#x7684;&amp;#x63CF;&amp;#x8FF0;&amp;#xFF0C;&amp;#x6765;&amp;#x8BBF;&amp;#x95EE;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x6A21;&amp;#x5757;&amp;#x4E86;&amp;#x3002;&amp;#x6BD4;&amp;#x5982;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5E94;&amp;#x8BE5;&amp;#x901A;&amp;#x8FC7;&amp;#x8BBF;&amp;#x95EE;&lt;code&gt;/users/sign_up&lt;/code&gt;&amp;#x7684;&amp;#x8DEF;&amp;#x5F84;&amp;#x6765;&amp;#x8C03;&amp;#x7528;&amp;#x6CE8;&amp;#x518C;&amp;#x6A21;&amp;#x5757;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/362/original/E209I02.png" width="801" height="478" alt="The signup for that devise generates."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x90A3;&amp;#x4E48;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x901A;&amp;#x8FC7;&amp;#x8FD9;&amp;#x4E2A;&amp;#x754C;&amp;#x9762;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5B8C;&amp;#x6210;&amp;#x6CE8;&amp;#x518C;&amp;#xFF0C;&amp;#x5C31;&amp;#x4F1A;&amp;#x9ED8;&amp;#x8BA4;&amp;#x5DF2;&amp;#x7ECF;&amp;#x767B;&amp;#x5F55;&amp;#x3002;&amp;#x8FD9;&amp;#x65F6;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&lt;code&gt;/users/sign_out&lt;/code&gt;&amp;#x6765;&amp;#x767B;&amp;#x51FA;&amp;#x3002;&amp;#x5F53;&amp;#x7136;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x8FD9;&amp;#x65F6;&amp;#x6211;&amp;#x4EEC;&amp;#x518D;&amp;#x6B21;&amp;#x8BD5;&amp;#x56FE;&amp;#x901A;&amp;#x8FC7;&amp;#x8BBF;&amp;#x95EE;&lt;code&gt;/users/sign_in&lt;/code&gt;&amp;#x6765;&amp;#x767B;&amp;#x5F55;&amp;#xFF0C;&amp;#x5E76;&amp;#x8F93;&amp;#x5165;&amp;#x521A;&amp;#x624D;&amp;#x6CE8;&amp;#x518C;&amp;#x7684;&amp;#x7528;&amp;#x6237;&amp;#x540D;&amp;#x548C;&amp;#x53E3;&amp;#x4EE4;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x4F1A;&amp;#x53D1;&amp;#x73B0;&amp;#x4E0B;&amp;#x9762;&amp;#x7684;&amp;#x9519;&amp;#x8BEF;&amp;#xFF1A;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/363/original/E209I03.png" width="801" height="372" alt="Signing in throws an error on Rails 3 beta 2."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x5B9E;&amp;#x9645;&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;Rails 3.0 beta 2&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x770B;&amp;#x5230;&amp;#x8FD9;&amp;#x4E2A;&amp;#x9519;&amp;#x8BEF;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x4FEE;&amp;#x6539; &lt;code&gt;/config/initializers/cookie_verification_secret.rb&lt;/code&gt;&amp;#x4E2D;&amp;#x7684;secret key&amp;#x6765;&amp;#x4FEE;&amp;#x6B63;&amp;#x3002;&amp;#x5176;&amp;#x4E2D;&amp;#xFF0C;secret key&amp;#x662F;&amp;#x7528;&amp;#x6765;&amp;#x9A8C;&amp;#x8BC1;&amp;#x767B;&amp;#x5F55;cookies&amp;#x7684;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/config/initalizers/cookie_verification_secret.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
# Be sure to restart your server when you modify this file.  
  
# Your secret key for verifying the integrity of signed cookies.  
# If you change this key, all old signed cookies will become invalid!  
# Make sure the secret is at least 30 characters and all random,   
# no regular words or you&amp;#x27;ll be exposed to dictionary attacks.  
Rails.application.config.cookie_secret = &amp;#x27;3b161f7668f938d1aeb73e1137964f8d5ebaf32b9173c2130ecb73b95b610702b77370640dce7e76700fb228f35f7865ab2a5ccd22d00563504a2ea9c3d8dffe&amp;#x27;  
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x505A;&amp;#x7684;&amp;#x5C31;&amp;#x662F;&amp;#x5728;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#x5220;&amp;#x9664;&amp;#x76F8;&amp;#x5173;&amp;#x63CF;&amp;#x8FF0;&amp;#xFF0C;&amp;#x5E76;&amp;#x4E14;&lt;code&gt;/config/application.rb&lt;/code&gt;&amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#x5220;&amp;#x9664;Rails.application&amp;#x7684;&amp;#x90E8;&amp;#x5206;&amp;#xFF0C;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/config/application.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
require File.expand_path(&amp;#x27;../boot&amp;#x27;, __FILE__)  
require &amp;#x27;rails/all&amp;#x27;  
  
Bundler.require(:default, Rails.env) if defined?(Bundler)  
  
module ProjectManage  
  class Application &amp;lt; Rails::Application  
    config.filter_parameters &amp;lt;&amp;lt; :password  
    config.cookie_secret = &amp;#x27;3b161f7668f938d1aeb73e1137964f8d5ebaf32b9173c2130ecb73b95b610702b77370640dce7e76700fb228f35f7865ab2a5ccd22d00563504a2ea9c3d8dffe&amp;#x27;  
  end  
end  
&lt;/pre&gt;

&lt;p&gt;&amp;#x91CD;&amp;#x542F;&amp;#x540E;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5E94;&amp;#x8BE5;&amp;#x53EF;&amp;#x4EE5;&amp;#x6B63;&amp;#x5E38;&amp;#x767B;&amp;#x5F55;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/364/original/E209I04.png" width="800" height="355" alt="Successfully signed up."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x5B9E;&amp;#x9645;&amp;#x4E0A;&amp;#xFF0C;&amp;#x5230;&amp;#x76EE;&amp;#x6807;&amp;#x6211;&amp;#x4EEC;&amp;#x5DF2;&amp;#x7ECF;&amp;#x5B8C;&amp;#x6210;&amp;#x4E86;&amp;#x6240;&amp;#x6709;&amp;#x7684;&amp;#x9A8C;&amp;#x8BC1;&amp;#x6743;&amp;#x9650;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&amp;#x63A5;&amp;#x4E0B;&amp;#x6765;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x8FDB;&amp;#x884C;&amp;#x4E00;&amp;#x4E9B;&amp;#x6539;&amp;#x8FDB;&amp;#x3002;&amp;#x901A;&amp;#x5E38;&amp;#x6211;&amp;#x4EEC;&amp;#x90FD;&amp;#x613F;&amp;#x610F;&amp;#x5728;&amp;#x9875;&amp;#x9762;&amp;#x4E0A;&amp;#x65B9;&amp;#x663E;&amp;#x793A;&amp;#x7528;&amp;#x6237;&amp;#x662F;&amp;#x5426;&amp;#x5DF2;&amp;#x7ECF;&amp;#x767B;&amp;#x5F55;&amp;#x7684;&amp;#x72B6;&amp;#x6001;&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x767B;&amp;#x5F55;&amp;#x5C31;&amp;#x663E;&amp;#x793A;&amp;#x7528;&amp;#x6237;&amp;#x7684;&amp;#x4E00;&amp;#x70B9;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6CA1;&amp;#x6709;&amp;#x767B;&amp;#x5F55;&amp;#x5C31;&amp;#x663E;&amp;#x793A;&amp;#x767B;&amp;#x5F55;&amp;#x548C;&amp;#x6CE8;&amp;#x518C;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#x9700;&amp;#x8981;&amp;#x5F88;&amp;#x5BB9;&amp;#x6613;&amp;#x5B9E;&amp;#x73B0;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;application&amp;#x7684;layout&amp;#x4E2D;&amp;#x6DFB;&amp;#x52A0;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x8F93;&amp;#x51FA;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;&amp;#x4EE5;&amp;#x4FBF;&amp;#x5728;&amp;#x6BCF;&amp;#x4E2A;&amp;#x9875;&amp;#x9762;&amp;#x90FD;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;#x540C;&amp;#x6837;&amp;#x7684;&amp;#x767B;&amp;#x5F55;&amp;#x4FE1;&amp;#x606F;&amp;#x3002;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/layouts/application.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;div id=&amp;quot;user_nav&amp;quot;&amp;gt;  
  &amp;lt;% if user_signed_in? %&amp;gt;  
    Signed in as &amp;lt;%= current_user.email %&amp;gt;. Not you?  
    &amp;lt;%= link_to &amp;quot;Sign out&amp;quot;, destroy_user_session_path %&amp;gt;  
  &amp;lt;% else %&amp;gt;  
    &amp;lt;%= link_to &amp;quot;Sign up&amp;quot;, new_user_registration_path %&amp;gt; or  
    &amp;lt;%= link_to &amp;quot;Sign in&amp;quot;, new_user_session_path %&amp;gt;  
  &amp;lt;% end %&amp;gt;  
&amp;lt;/div&amp;gt;  
&lt;/pre&gt;

&lt;p&gt;&amp;#x7B80;&amp;#x5355;&amp;#x89E3;&amp;#x91CA;&amp;#x4E00;&amp;#x4E0B;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6BB5;&amp;#x663E;&amp;#x793A;&amp;#x767B;&amp;#x5F55;&amp;#x4FE1;&amp;#x606F;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x3002;&amp;#x8FD9;&amp;#x6BB5;&amp;#x4EE3;&amp;#x7801;&amp;#x4E3B;&amp;#x8981;&amp;#x662F;&amp;#x901A;&amp;#x8FC7;devise&amp;#x63D0;&amp;#x4F9B;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#x5B9E;&amp;#x73B0;&amp;#xFF0C;&amp;#x5176;&amp;#x4E2D;&amp;#xFF0C;&amp;#x5224;&amp;#x65AD;&amp;#x662F;&amp;#x5426;&amp;#x767B;&amp;#x5F55;&amp;#x662F;&amp;#x901A;&amp;#x8FC7; &lt;code&gt;user_signed_in?&lt;/code&gt; &amp;#x5982;&amp;#x679C;&amp;#x767B;&amp;#x5F55;&amp;#x4E86;&amp;#xFF0C;&amp;#x5C31;&amp;#x901A;&amp;#x8FC7;&lt;code&gt;current_user&lt;/code&gt;&amp;#x6765;&amp;#x663E;&amp;#x793A;&amp;#x5F53;&amp;#x524D;&amp;#x7528;&amp;#x6237;&amp;#x7684;email&amp;#xFF0C;&amp;#x800C;&amp;#x9000;&amp;#x51FA;&amp;#x7684;&amp;#x8DEF;&amp;#x5F84;&amp;#x662F;devise&amp;#x901A;&amp;#x8FC7; &lt;code&gt;destroy_user_session&lt;/code&gt;&amp;#x6807;&amp;#x8BC6;&amp;#x5230;&lt;code&gt;/users/sign_out&lt;/code&gt;&amp;#x3002;&amp;#x540C;&amp;#x6837;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6CA1;&amp;#x6709;&amp;#x767B;&amp;#x5F55;&amp;#x7684;&amp;#x8BDD;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7; &lt;code&gt;new_user_registration_path&lt;/code&gt; &amp;#x548C; &lt;code&gt;new_user_session_path&lt;/code&gt; &amp;#x5206;&amp;#x522B;&amp;#x8868;&amp;#x793A;&amp;#x6CE8;&amp;#x518C;&amp;#x548C;&amp;#x767B;&amp;#x5F55;&amp;#x7684;&amp;#x8DEF;&amp;#x5F84;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/365/original/E209I05.png" width="800" height="355" alt="The user's details are now shown at the top of each page."/&gt;
&lt;/div&gt;
  &lt;p&gt;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x628A;&amp;#x4EE3;&amp;#x7801;&amp;#x5199;&amp;#x597D;&amp;#xFF0C;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x4FE1;&amp;#x606F;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/366/original/E209I06.png" width="800" height="371" alt="Links to sign in or sign up are now shown when the user isn't logged in."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x6B63;&amp;#x5982;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0A;&amp;#x9762;&amp;#x64CD;&amp;#x4F5C;&amp;#x7684;&amp;#xFF0C;&amp;#x901A;&amp;#x8FC7;&amp;#x4F7F;&amp;#x7528;devise&amp;#xFF0C;&amp;#x6DFB;&amp;#x52A0;&amp;#x5F88;&amp;#x5C11;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x62E5;&amp;#x6709;&amp;#x6CE8;&amp;#x518C;&amp;#xFF0C;&amp;#x767B;&amp;#x5F55;&amp;#xFF0C;&amp;#x9000;&amp;#x51FA;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&amp;#x5F53;&amp;#x7136;&amp;#xFF0C;devise&amp;#x8FD8;&amp;#x6709;&amp;#x66F4;&amp;#x591A;&amp;#x7684;&amp;#x76F8;&amp;#x5173;&amp;#x529F;&amp;#x80FD;&amp;#x4E5F;&amp;#x76F8;&amp;#x5F53;&amp;#x5BB9;&amp;#x6613;&amp;#x4E0A;&amp;#x624B;&amp;#x4F7F;&amp;#x7528;&amp;#x3002;&amp;#x6BD4;&amp;#x5982;&amp;#xFF0C;&amp;#x91CD;&amp;#x65B0;&amp;#x8BBE;&amp;#x7F6E;&amp;#x5BC6;&amp;#x7801;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x6A21;&amp;#x5757;&amp;#xFF0C;&amp;#x4E5F;&amp;#x662F;&amp;#x5728;User&amp;#x7684;model&amp;#x91CC;&amp;#x52A0;&amp;#x4E0A;confirmable&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x62E5;&amp;#x6709;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/367/original/E209I07.png" width="800" height="371" alt="The reset password page."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x6700;&amp;#x540E;&amp;#xFF0C;&amp;#x53EF;&amp;#x80FD;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x60F3;&amp;#x5230;&amp;#x4E00;&amp;#x4E2A;&amp;#x95EE;&amp;#x9898;&amp;#x3002;&amp;#x56E0;&amp;#x4E3A;&amp;#xFF0C;&amp;#x6240;&amp;#x6709;&amp;#x7684;&amp;#x767B;&amp;#x5F55;&amp;#xFF0C;&amp;#x6743;&amp;#x9650;&amp;#x76F8;&amp;#x5173;&amp;#x7684;&amp;#x754C;&amp;#x9762;&amp;#x4E5F;&amp;#x90FD;&amp;#x662F;devise&amp;#x751F;&amp;#x6210;&amp;#x7684;&amp;#xFF0C;&amp;#x90A3;&amp;#x4E48;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5E0C;&amp;#x671B;&amp;#x9875;&amp;#x9762;&amp;#x98CE;&amp;#x683C;&amp;#x548C;&amp;#x6211;&amp;#x4EEC;&amp;#x81EA;&amp;#x5DF1;&amp;#x7684;&amp;#x7F51;&amp;#x7AD9;&amp;#x7684;&amp;#x98CE;&amp;#x683C;&amp;#x4E00;&amp;#x81F4;&amp;#xFF0C;&amp;#x600E;&amp;#x4E48;&amp;#x529E;&amp;#xFF1F;&amp;#x5B9E;&amp;#x9645;&amp;#x4E0A;&amp;#xFF0C;devise&amp;#x4E5F;&amp;#x8003;&amp;#x8651;&amp;#x5230;&amp;#x4E86;&amp;#x8FD9;&amp;#x4E00;&amp;#x70B9;&amp;#xFF0C;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x5F88;&amp;#x5BB9;&amp;#x6613;&amp;#x7684;&amp;#x5B9A;&amp;#x5236;devise&amp;#x7684;&amp;#x9014;&amp;#x5F84;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x5728;&amp;#x4E0B;&amp;#x4E00;&amp;#x7BC7;&amp;#x4E2D;&amp;#x4ECB;&amp;#x7ECD;&amp;#x3002;&lt;/p&gt;</description>
      <pubDate>Sun, 13 Jun 2010 22:29:39 +0000</pubDate>
      <guid>http://cn.asciicasts.com/episodes/209-introducing-devise</guid>
      <link>http://cn.asciicasts.com/episodes/209-introducing-devise</link>
    </item>
    <item>
      <title>&#35821;&#27861;&#39640;&#20142;</title>
      <description>&lt;p&gt;&amp;#x6709;&amp;#x65F6;&amp;#x5019;&amp;#x9700;&amp;#x8981;&amp;#x5C55;&amp;#x793A;Rails&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4E2D;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x7247;&amp;#x6BB5;&amp;#xFF0C;&amp;#x4E3A;&amp;#x4F7F;&amp;#x4EE3;&amp;#x7801;&amp;#x53EF;&amp;#x8BFB;&amp;#x6027;&amp;#x66F4;&amp;#x9AD8;&amp;#xFF0C;&amp;#x4F60;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x3002;&amp;#x57FA;&amp;#x672C;&amp;#x4E0A;&amp;#x6BCF;&amp;#x4E00;&amp;#x671F;&amp;#x6211;&amp;#x90FD;&amp;#x662F;&amp;#x8FD9;&amp;#x4E48;&amp;#x505A;&amp;#x7684;&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x662F;&amp;#x600E;&amp;#x4E48;&amp;#x5B9E;&amp;#x73B0;&amp;#x7684;&amp;#x5462;&amp;#xFF1F;&lt;/p&gt;
 &lt;p&gt;&amp;#x6709;&amp;#x51E0;&amp;#x79CD;&amp;#x4E0D;&amp;#x540C;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#x53EF;&amp;#x4EE5;&amp;#x5411;Rails&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4E2D;&amp;#x52A0;&amp;#x4E0A;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&amp;#x9996;&amp;#x5148;&amp;#x4F60;&amp;#x8981;&amp;#x786E;&amp;#x5B9A;&amp;#xFF0C;&amp;#x4F60;&amp;#x662F;&amp;#x60F3;&amp;#x7528;Rails&amp;#x5728;&amp;#x670D;&amp;#x52A1;&amp;#x5668;&amp;#x7AEF;&amp;#x5B9E;&amp;#x73B0;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#xFF0C;&amp;#x8FD8;&amp;#x662F;&amp;#x60F3;&amp;#x7528;JavaScript&amp;#x5E93;&amp;#x5728;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x4E2D;&amp;#x8F6C;&amp;#x6362;&amp;#x9875;&amp;#x9762;&amp;#x5B9E;&amp;#x73B0;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x3002;&amp;#x6709;&amp;#x8BB8;&amp;#x591A;Javascript&amp;#x5E93;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;&amp;#x4E8E;&amp;#x5BA2;&amp;#x6237;&amp;#x7AEF;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x663E;&amp;#x793A;&amp;#xFF0C;&amp;#x4F46;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD9;&amp;#x513F;&amp;#x4E0D;&amp;#x8BA8;&amp;#x8BBA;&amp;#x5B83;&amp;#x4EEC;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#x5B83;&amp;#x4EEC;&amp;#x4E0D;&amp;#x662F;Rails&amp;#x7279;&amp;#x6709;&amp;#x7684;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x8981;&amp;#x4E3A;&amp;#x4F60;&amp;#x5C55;&amp;#x793A;&amp;#x7684;&amp;#x662F;Rails&amp;#x4E16;&amp;#x754C;&amp;#x4E2D;&amp;#x6D41;&amp;#x884C;&amp;#x7684;3&amp;#x4E2A;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x5B9E;&amp;#x7528;&amp;#x5DE5;&amp;#x5177;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;CodeRay&lt;/h3&gt;
  &lt;p&gt;&amp;#x7B2C;&amp;#x4E00;&amp;#x4E2A;&amp;#x662F;&lt;a href="http://coderay.rubychan.de"&gt;CodeRay&lt;/a&gt;&amp;#x3002;&amp;#x5B83;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;Gem&amp;#x5B89;&amp;#x88C5;&amp;#xFF0C;&amp;#x975E;&amp;#x5E38;&amp;#x7B80;&amp;#x5355;&amp;#xFF0C;&amp;#x4E5F;&amp;#x6CA1;&amp;#x6709;&amp;#x989D;&amp;#x5916;&amp;#x7684;&amp;#x4F9D;&amp;#x8D56;&amp;#x7EC4;&amp;#x4EF6;&amp;#xFF0C;&amp;#x5E76;&amp;#x4E14;CodeRay&amp;#x7684;&amp;#x901F;&amp;#x5EA6;&amp;#x975E;&amp;#x5E38;&amp;#x5FEB;&amp;#x3002;&amp;#x7136;&amp;#x800C;&amp;#x5B83;&amp;#x63D0;&amp;#x4F9B;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x7279;&amp;#x6027;&amp;#x6709;&amp;#x9650;&amp;#xFF0C;&amp;#x652F;&amp;#x6301;&amp;#x7684;&amp;#x8BED;&amp;#x8A00;&amp;#x79CD;&amp;#x7C7B;&amp;#x4E5F;&amp;#x4E0D;&amp;#x591A;&amp;#x3002;&amp;#x4F46;&amp;#x5982;&amp;#x679C;&amp;#x5B83;&amp;#x63D0;&amp;#x4F9B;&amp;#x7684;&amp;#x6B63;&amp;#x662F;&amp;#x4F60;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x6240;&amp;#x9700;&amp;#x8981;&amp;#x7684;&amp;#xFF0C;&amp;#x90A3;&amp;#x5B83;&amp;#x4F1A;&amp;#x662F;&amp;#x975E;&amp;#x5E38;&amp;#x597D;&amp;#x7684;&amp;#x89E3;&amp;#x51B3;&amp;#x65B9;&amp;#x6848;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x5728;&amp;#x8FD9;&amp;#x671F;&amp;#x7684;&amp;#x540E;&amp;#x9762;&amp;#x8BE6;&amp;#x7EC6;&amp;#x7684;&amp;#x7814;&amp;#x7A76;&amp;#x5B83;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;Ultraviolet&lt;/h3&gt;
&lt;p&gt;&amp;#x7B2C;&amp;#x4E8C;&amp;#x4E2A;&amp;#x9009;&amp;#x62E9;&amp;#x662F;&lt;a href="http://ultraviolet.rubyforge.org"&gt;Ultraviolet&lt;/a&gt;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E5F;&amp;#x662F;&amp;#x4E2A;Gem&amp;#x7EC4;&amp;#x4EF6;&amp;#xFF0C;&amp;#x4E0D;&amp;#x8FC7;&amp;#x5B83;&amp;#x8FD8;&amp;#x6709;&amp;#x4E00;&amp;#x4E9B;&amp;#x4F9D;&amp;#x8D56;&amp;#x7684;&amp;#x7EC4;&amp;#x4EF6;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#x5B89;&amp;#x88C5;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x6709;&amp;#x4E9B;&amp;#x9EBB;&amp;#x70E6;&amp;#x3002;Ultraviolet&amp;#x8981;&amp;#x6BD4;CodeRay&amp;#x6162;&amp;#xFF0C;&amp;#x4E0D;&amp;#x8FC7;Ultraviolet&amp;#x62E5;&amp;#x6709;&amp;#x66F4;&amp;#x591A;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x7279;&amp;#x6027;&amp;#x3002;Ultraviolet&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;TextMate&amp;#xFF08;Mac&amp;#x4E0B;&amp;#x7684;&amp;#x8457;&amp;#x540D;&amp;#x7684;&amp;#x6587;&amp;#x672C;&amp;#x7F16;&amp;#x8F91;&amp;#x5668;&amp;#x8F6F;&amp;#x4EF6;&amp;#xFF09;&amp;#x7684;&amp;#x8BED;&amp;#x6CD5;&amp;#x6587;&amp;#x4EF6;&amp;#x548C;&amp;#x4E3B;&amp;#x9898;&amp;#x3002;&amp;#x56E0;&amp;#x6B64;Ultraviolet&amp;#x6BD4;CodeRay&amp;#x652F;&amp;#x6301;&amp;#x66F4;&amp;#x591A;&amp;#x79CD;&amp;#x8BED;&amp;#x8A00;&amp;#xFF0C;&amp;#x5BF9;&amp;#x4E8E;&amp;#x5982;&amp;#x4F55;&amp;#x9AD8;&amp;#x4EAE;&amp;#x663E;&amp;#x793A;&amp;#x4EE3;&amp;#x7801;&amp;#x7247;&amp;#x6BB5;&amp;#x4E5F;&amp;#x66F4;&amp;#x52A0;&amp;#x7075;&amp;#x6D3B;&amp;#x3002;&lt;/p&gt;
 &lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x9009;&amp;#x62E9;Ultraviolet&amp;#x7528;&amp;#x4E8E;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#xFF0C;&amp;#x5C31;&amp;#x6709;&amp;#x5FC5;&amp;#x8981;&amp;#x770B;&amp;#x4E00;&amp;#x770B;&lt;a href="http://github.com/michaeledgar/harsh"&gt;Harsh&lt;/a&gt;&amp;#x3002;Harsh&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;Rails&amp;#x63D2;&amp;#x4EF6;&amp;#xFF0C;&amp;#x5B83;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x4E00;&amp;#x4E2A;&amp;#x975E;&amp;#x5E38;&amp;#x597D;&amp;#x7684;helper&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;&amp;#x6765;&amp;#x5728;&amp;#x89C6;&amp;#x56FE;&amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#x9AD8;&amp;#x4EAE;&amp;#x663E;&amp;#x793A;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x5B83;&amp;#x8FD8;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x4E00;&amp;#x4E9B;rake&amp;#x4EFB;&amp;#x52A1;&amp;#x6765;&amp;#x5B89;&amp;#x88C5;&amp;#x4E3B;&amp;#x9898;&amp;#x548C;&amp;#x7BA1;&amp;#x7406;&amp;#x4E3B;&amp;#x9898;&amp;#x3002;Ultraviolet&amp;#x7684;README&amp;#x6587;&amp;#x4EF6;&amp;#x5BF9;&amp;#x5982;&amp;#x4F55;&amp;#x5B89;&amp;#x88C5;Ultraviolet&amp;#x63D0;&amp;#x4F9B;&amp;#x7684;&amp;#x5F88;&amp;#x6709;&amp;#x7528;&amp;#x7684;&amp;#x6307;&amp;#x5BFC;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;Pygments&lt;/h3&gt;
&lt;p&gt;&amp;#x7B2C;&amp;#x4E09;&amp;#x4E2A;&amp;#x5E38;&amp;#x7528;&amp;#x7684;&amp;#x9009;&amp;#x62E9;&amp;#x662F;&lt;a href="http://pygments.org/"&gt;Pygments&lt;/a&gt;&amp;#x3002; Pygments&amp;#x548C;CodeRay&amp;#x3001;Ultraviolet&amp;#x90FD;&amp;#x4E0D;&amp;#x540C;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#x5B83;&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;Python&amp;#x5E93;&amp;#x3002;&amp;#x4F46;&amp;#x7531;&amp;#x4E8E;Pygments&amp;#x63D0;&amp;#x4F9B;&amp;#x547D;&amp;#x4EE4;&amp;#x884C;&amp;#x5B9E;&amp;#x7528;&amp;#x5DE5;&amp;#x5177;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;Rails&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x53EF;&amp;#x4EE5;&amp;#x8C03;&amp;#x7528;&amp;#x5B83;&amp;#x3002; Pygments&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;&amp;#x529F;&amp;#x80FD;&amp;#x975E;&amp;#x5E38;&amp;#x5168;&amp;#x9762;&amp;#x7684;&amp;#x5E93;&amp;#xFF0C;&amp;#x62E5;&amp;#x6709;&amp;#x826F;&amp;#x597D;&amp;#x7684;&amp;#x652F;&amp;#x6301;&amp;#xFF0C;&amp;#x5E76;&amp;#x88AB;&amp;#x5E7F;&amp;#x6CDB;&amp;#x7528;&amp;#x4E8E;&amp;#x5F88;&amp;#x591A;&amp;#x7F51;&amp;#x7AD9;&amp;#x3002;&amp;#x4F46;&amp;#x5B83;&amp;#x7684;&amp;#x7F3A;&amp;#x70B9;&amp;#x662F;&amp;#xFF0C;&amp;#x5F53;&amp;#x4F60;&amp;#x8BD5;&amp;#x56FE;&amp;#x5728;Rails&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4E2D;&amp;#x5206;&amp;#x6790;&amp;#x5F88;&amp;#x5927;&amp;#x7684;&amp;#x6587;&amp;#x4EF6;&amp;#x65F6;&amp;#xFF0C;&amp;#x901F;&amp;#x5EA6;&amp;#x4F1A;&amp;#x53D8;&amp;#x5F97;&amp;#x975E;&amp;#x5E38;&amp;#x6162;&amp;#x3002;&amp;#x6240;&amp;#x4EE5;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x8003;&amp;#x8651;&amp;#x5728;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4E2D;&amp;#x4F7F;&amp;#x7528;Pygments&amp;#x65F6;&amp;#xFF0C;&amp;#x6709;&amp;#x5FC5;&amp;#x8981;&amp;#x4F7F;&amp;#x7528;&amp;#x7F13;&amp;#x5B58;&amp;#x3002;&lt;/p&gt;
&lt;p&gt;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x975E;&amp;#x5E38;&amp;#x597D;&amp;#x7684;&amp;#x63D2;&amp;#x4EF6;highlight&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;Pygments&amp;#x5728;Rails&amp;#x4E2D;&amp;#x5E94;&amp;#x7528;&amp;#x8D77;&amp;#x6765;&amp;#x66F4;&amp;#x52A0;&amp;#x7B80;&amp;#x5355;&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&lt;a href="http://github.com/simplabs/highlight"&gt;highlight&lt;/a&gt;&amp;#x63D2;&amp;#x4EF6;&amp;#x5C01;&amp;#x88C5;&amp;#x4E86;Pygments&amp;#xFF0C;&amp;#x4F60;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;&amp;#x89C6;&amp;#x56FE;&amp;#x4E2D;&amp;#x7528;&amp;#x4E00;&amp;#x4E2A;&amp;#x5F88;&amp;#x7B80;&amp;#x5355;&amp;#x7684;helper&amp;#x65B9;&amp;#x6CD5;&amp;#x6765;&amp;#x8C03;&amp;#x7528;&amp;#x5B83;&amp;#x3002;&amp;#x8003;&amp;#x8651;Pygments&amp;#x901F;&amp;#x5EA6;&amp;#x65B9;&amp;#x9762;&amp;#x7684;&amp;#x539F;&amp;#x56E0;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5EFA;&amp;#x8BAE;&amp;#x4F7F;&amp;#x7528;highlight&amp;#x65F6;&amp;#xFF0C;&amp;#x5B83;&amp;#x4EA7;&amp;#x751F;&amp;#x7684;&amp;#x4EFB;&amp;#x4F55;&amp;#x8F93;&amp;#x51FA;&amp;#x90FD;&amp;#x8981;&amp;#x7F13;&amp;#x5B58;&amp;#x3002;&amp;#x4E3A;&amp;#x4E86;&amp;#x5B9E;&amp;#x73B0;&amp;#x7F13;&amp;#x5B58;&amp;#xFF0C;&amp;#x53EA;&amp;#x8981;&amp;#x5C06;&amp;#x6240;&amp;#x6709;&amp;#x7684;&amp;#x8F93;&amp;#x51FA;&amp;#x5305;&amp;#x542B;&amp;#x5728;&amp;#x4E00;&amp;#x4E2A;&lt;code&gt;cache&lt;/code&gt;&amp;#x5757;&amp;#x4E2D;&amp;#xFF0C;&amp;#x50CF;&amp;#x8FD9;&amp;#x6837;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;lt;% cache do %&amp;gt;   
&amp;lt;%= highlight(:ruby, &amp;#x27;class Test; end&amp;#x27;) -%&amp;gt;   
&amp;lt;% end %&amp;gt; 
&lt;/pre&gt; 

&lt;h3&gt;&amp;#x6807;&amp;#x8BB0;&lt;/h3&gt;
   &lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5DF2;&amp;#x7ECF;&amp;#x5927;&amp;#x6982;&amp;#x4E86;&amp;#x89E3;&amp;#x4E86;&amp;#x4E0A;&amp;#x9762;&amp;#x8C08;&amp;#x5230;&amp;#x7684;3&amp;#x79CD;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x5DE5;&amp;#x5177;&amp;#xFF0C;&amp;#x73B0;&amp;#x5728;&amp;#x6765;&amp;#x6BD4;&amp;#x8F83;&amp;#x4E00;&amp;#x4E0B;&amp;#x5B83;&amp;#x4EEC;&amp;#x5728;&amp;#x901F;&amp;#x5EA6;&amp;#x4E0A;&amp;#x7684;&amp;#x8868;&amp;#x73B0;&amp;#x3002;&amp;#x4E00;&amp;#x4E2A;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x53EF;&amp;#x80FD;&amp;#x9700;&amp;#x8981;&amp;#x6E32;&amp;#x67D3;&amp;#x8BB8;&amp;#x591A;&amp;#x9AD8;&amp;#x4EAE;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x8003;&amp;#x8651;&amp;#x662F;&amp;#x5426;&amp;#x7F13;&amp;#x5B58;&amp;#x8F93;&amp;#x51FA;&amp;#x7684;&amp;#x7ED3;&amp;#x679C;&amp;#x3002;&amp;#x4E3A;&amp;#x4E86;&amp;#x6BD4;&amp;#x8F83;&amp;#x8FD9;3&amp;#x79CD;&amp;#x5DE5;&amp;#x5177;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x4F7F;&amp;#x7528;&amp;#x4E0B;&amp;#x9762;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="ruby"&gt; 
require &amp;#x27;rubygems&amp;#x27;  
require &amp;#x27;benchmark&amp;#x27;  
require &amp;#x27;coderay&amp;#x27;  
require &amp;#x27;uv&amp;#x27;  

path = __FILE__   
content = File.read(__FILE__)   

# run it once to initialize   
CodeRay.scan(&amp;quot;print &amp;#x27;hello&amp;#x27;&amp;quot;,  &amp;#x27;ruby&amp;#x27;).div(:css =&amp;gt; :class)   
Uv.parse(&amp;quot;print &amp;#x27;test&amp;#x27;&amp;quot;, &amp;#x27;xhtml&amp;#x27;, &amp;#x27;ruby&amp;#x27;, true, &amp;#x27;amy&amp;#x27;)   

Benchmark.bm(11) do |b|   
b.report &amp;#x27;coderay&amp;#x27; do  
  50.times { CodeRay.scan(content, &amp;#x27;ruby&amp;#x27;).div(:css =&amp;gt; :class) }   
end  

b.report(&amp;#x27;ultraviolet&amp;#x27;) do  
  50.times { Uv.parse(content, &amp;#x27;xhtml&amp;#x27;, &amp;#x27;ruby&amp;#x27;, true, &amp;#x27;amy&amp;#x27;) }   
end  

b.report(&amp;#x27;pygments&amp;#x27;) do  
  50.times { `pygmentize -f html &amp;quot;#{path}&amp;quot;` }   
end  
end  
&lt;/pre&gt;
  &lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;&amp;#x57FA;&amp;#x51C6;&amp;#x6D4B;&amp;#x8BD5;&amp;#x4EE3;&amp;#x7801;&amp;#x5206;&amp;#x522B;&amp;#x7528;3&amp;#x79CD;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x5DE5;&amp;#x5177;&amp;#x5E93;&amp;#x628A;&amp;#x81EA;&amp;#x8EAB;&amp;#x5185;&amp;#x5BB9;&amp;#x89E3;&amp;#x6790;50&amp;#x904D;&amp;#xFF0C;Pygments&amp;#x4F7F;&amp;#x7528;&amp;#x7684;&amp;#x662F;&lt;code&gt;pygmentize&lt;/code&gt; &amp;#x547D;&amp;#x4EE4;&amp;#x3002;&amp;#x8FD0;&amp;#x884C;&amp;#x7ED3;&amp;#x679C;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="terminal"&gt;
$ ruby benchmark.rb 
               user     system      total        real
coderay      0.310000   0.010000   0.320000 (  0.312954)
ultraviolet  4.860000   0.020000   4.880000 (  4.886621)
pygments     0.010000   0.120000  12.430000 ( 12.643173)
&lt;/pre&gt; 
  &lt;p&gt;&amp;#x4ECE;&amp;#x4E0A;&amp;#x9762;&amp;#x770B;&amp;#x51FA;&amp;#x6BCF;&amp;#x4E2A;&amp;#x5E93;&amp;#x7684;&amp;#x8868;&amp;#x73B0;&amp;#x5DEE;&amp;#x522B;&amp;#x5F88;&amp;#x5927;&amp;#x3002;CodeRay&amp;#x663E;&amp;#x7136;&amp;#x662F;&amp;#x6700;&amp;#x5FEB;&amp;#x7684;&amp;#xFF0C;&amp;#x8FED;&amp;#x4EE3;50&amp;#x6B21;&amp;#x53EA;&amp;#x7528;&amp;#x4E86;0.3&amp;#x79D2;&amp;#x5DE6;&amp;#x53F3;&amp;#x3002;Ultraviolet&amp;#x7528;&amp;#x4E86;CodeRay10&amp;#x500D;&amp;#x591A;&amp;#x7684;&amp;#x65F6;&amp;#x95F4;&amp;#xFF0C;&amp;#x800C;Pygments&amp;#x8FD8;&amp;#x8981;&amp;#x66F4;&amp;#x6162;&amp;#xFF0C;&amp;#x5B8C;&amp;#x6210;&amp;#x4E0A;&amp;#x9762;&amp;#x6D4B;&amp;#x8BD5;&amp;#x7528;&amp;#x4E86;&amp;#x8D85;&amp;#x8FC7;12&amp;#x79D2;&amp;#x7684;&amp;#x65F6;&amp;#x95F4;&amp;#x3002;&amp;#x8FD9;&amp;#x4E09;&amp;#x4E2A;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x5DE5;&amp;#x5177;&amp;#x5E93;&amp;#x901F;&amp;#x5EA6;&amp;#x5DEE;&amp;#x522B;&amp;#x5982;&amp;#x6B64;&amp;#x4E4B;&amp;#x5927;&amp;#xFF0C;&amp;#x5728;&amp;#x9009;&amp;#x62E9;&amp;#x5230;&amp;#x5E95;&amp;#x7528;&amp;#x54EA;&amp;#x4E00;&amp;#x4E2A;&amp;#x65F6;&amp;#xFF0C;&amp;#x529F;&amp;#x80FD;&amp;#x7279;&amp;#x6027;&amp;#x548C;&amp;#x6027;&amp;#x80FD;&amp;#x8868;&amp;#x73B0;&amp;#x4E24;&amp;#x65B9;&amp;#x9762;&amp;#x53D6;&amp;#x5F97;&amp;#x5E73;&amp;#x8861;&amp;#x5F88;&amp;#x91CD;&amp;#x8981;&amp;#x3002;&amp;#x5F53;&amp;#x7136;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x4F7F;&amp;#x7528;&amp;#x7F13;&amp;#x5B58;&amp;#xFF0C;&amp;#x90A3;&amp;#x901F;&amp;#x5EA6;&amp;#x5C31;&amp;#x4E0D;&amp;#x518D;&amp;#x662F;&amp;#x4E2A;&amp;#x95EE;&amp;#x9898;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;&amp;#x4F7F;&amp;#x7528;CodeRay&lt;/h3&gt;
 &lt;p&gt;&amp;#x672C;&amp;#x671F;&amp;#x63A5;&amp;#x4E0B;&amp;#x6765;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x5411;&amp;#x4F60;&amp;#x5C55;&amp;#x793A;&amp;#x5982;&amp;#x4F55;&amp;#x5728;Rails&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4E2D;&amp;#x4F7F;&amp;#x7528;CodeRay&amp;#x3002;CodeRay&amp;#x662F;&amp;#x4E09;&amp;#x4E2A;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x5DE5;&amp;#x5177;&amp;#x5E93;&amp;#x4E2D;&amp;#x5B89;&amp;#x88C5;&amp;#x8D77;&amp;#x6765;&amp;#x6700;&amp;#x7B80;&amp;#x5355;&amp;#x800C;&amp;#x4E14;&amp;#x901F;&amp;#x5EA6;&amp;#x6700;&amp;#x5FEB;&amp;#x7684;&amp;#xFF0C;&amp;#x56E0;&amp;#x6B64;&amp;#x6CA1;&amp;#x6709;&amp;#x5FC5;&amp;#x8981;&amp;#x62C5;&amp;#x5FC3;&amp;#x7F13;&amp;#x5B58;&amp;#x95EE;&amp;#x9898;&amp;#x3002;&lt;/p&gt;
  &lt;p&gt;&amp;#x4E3A;&amp;#x4E86;&amp;#x5C55;&amp;#x793A;CodeRay&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x4F7F;&amp;#x7528;&amp;#x4E00;&amp;#x4E2A;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x535A;&amp;#x5BA2;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#xFF0C;&amp;#x4F60;&amp;#x5728;&amp;#x524D;&amp;#x671F;&amp;#x8282;&amp;#x76EE;&amp;#x4E2D;&amp;#x53EF;&amp;#x80FD;&amp;#x89C1;&amp;#x8FC7;&amp;#x8FD9;&amp;#x4E2A;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4E86;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x7528;CodeRay&amp;#x4E3A;&amp;#x8FD9;&amp;#x4E2A;&amp;#x535A;&amp;#x5BA2;&amp;#x7A0B;&amp;#x5E8F;&amp;#x52A0;&amp;#x5165;&amp;#x4E0B;&amp;#x9762;&amp;#x529F;&amp;#x80FD;&amp;#xFF1A;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x663E;&amp;#x793A;&amp;#x6587;&amp;#x7AE0;&amp;#x4E2D;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x7247;&amp;#x6BB5;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
&lt;img src="/system/photos/355/original/E207I01.png" width="817" height="464" alt="Our blogging application."/&gt;
&lt;/div&gt;
 &lt;p&gt;&amp;#x5F53;&amp;#x4F5C;&amp;#x8005;&amp;#x7F16;&amp;#x8F91;&amp;#x6587;&amp;#x7AE0;&amp;#x65F6;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5E0C;&amp;#x671B;&amp;#x80FD;&amp;#x5728;&amp;#x4EE3;&amp;#x7801;&amp;#x6807;&amp;#x7B7E;&amp;#x4E2D;&amp;#x52A0;&amp;#x5165;&amp;#x4EE3;&amp;#x7801;&amp;#x7247;&amp;#x6BB5;&amp;#xFF0C;&amp;#x50CF;&amp;#x8FD9;&amp;#x6837;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;lt;code lang=&amp;quot;ruby&amp;quot;&amp;gt;   
puts &amp;quot;Hello, world!&amp;quot;  
&amp;lt;/code&amp;gt;  
&lt;/pre&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x50CF;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x7247;&amp;#x6BB5;&amp;#x51FA;&amp;#x73B0;&amp;#x5728;&amp;#x6587;&amp;#x7AE0;&amp;#x6B63;&amp;#x6587;&amp;#x4E2D;&amp;#x65F6;&amp;#xFF0C;&amp;#x9700;&amp;#x8981;&amp;#x901A;&amp;#x8FC7;&amp;#x9002;&amp;#x5F53;&amp;#x7684;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x663E;&amp;#x793A;&amp;#x51FA;&amp;#x6765;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x4E3A;&amp;#x4E86;&amp;#x5B9E;&amp;#x73B0;&amp;#x8FD9;&amp;#x70B9;&amp;#xFF0C;&amp;#x9996;&amp;#x5148;&amp;#x8981;&amp;#x5728;&lt;code&gt;/config/environment.rb&lt;/code&gt; &amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#x52A0;&amp;#x5165;CodeRay gem&amp;#x7EC4;&amp;#x4EF6;&amp;#x7684;&amp;#x5F15;&amp;#x7528;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;&amp;#x8FD9;&amp;#x662F;&amp;#x9488;&amp;#x5BF9;Rails 2&amp;#x7684;&amp;#x60C5;&amp;#x51B5;&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x662F;Rails 3 &amp;#x5219;&amp;#x9700;&amp;#x8981;&amp;#x4FEE;&amp;#x6539;Gemfile&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/config/environment.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;   
Rails::Initializer.run do |config|   
config.gem &amp;quot;coderay&amp;quot;  
config.gem &amp;quot;RedCloth&amp;quot;  
end  
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x540E;&amp;#x9762;&amp;#x5C06;&amp;#x7528;&amp;#x5230;Textile&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#x8FD9;&amp;#x513F;&amp;#x8981;&amp;#x5B89;&amp;#x88C5;RedCloth gem &amp;#x7EC4;&amp;#x4EF6;&amp;#x3002;&amp;#x6709;&amp;#x4E2A;gem&amp;#x7EC4;&amp;#x4EF6;&amp;#x6346;&amp;#x7ED1;&amp;#x4E86;CodeRay&amp;#x548C;RedCloth&amp;#xFF0C;&amp;#x4F46;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD9;&amp;#x91CC;&amp;#x6253;&amp;#x7B97;&amp;#x5206;&amp;#x5F00;&amp;#x6765;&amp;#x5B89;&amp;#x88C5;&amp;#x5B83;&amp;#x4EEC;&amp;#x3002;&lt;/p&gt;
 &lt;p&gt;&amp;#x63A5;&amp;#x4E0B;&amp;#x6765;&amp;#x6211;&amp;#x4EEC;&amp;#x66F4;&amp;#x65B0;&lt;code&gt;ArticleController&lt;/code&gt;&amp;#x7684;&amp;#x89C6;&amp;#x56FE;&amp;#x6587;&amp;#x4EF6;&lt;code&gt;show&lt;/code&gt;&amp;#xFF0C;&amp;#x7528;CodeRay&amp;#x89E3;&amp;#x6790;&amp;#x4EE3;&amp;#x7801;&amp;#x6807;&amp;#x7B7E;&amp;#x4E2D;&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#x5E76;&amp;#x9AD8;&amp;#x4EAE;&amp;#x663E;&amp;#x793A;&amp;#x5B83;&amp;#x4EEC;&amp;#x3002;&amp;#x4E3A;&amp;#x6B64;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x5C06;&amp;#x663E;&amp;#x793A;&amp;#x6587;&amp;#x7AE0;&amp;#x5185;&amp;#x5BB9;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x4F20;&amp;#x9012;&amp;#x7ED9;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x7684;helper&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E2A;&amp;#x65B9;&amp;#x6CD5;&amp;#x53EB;&lt;code&gt;coderay&lt;/code&gt;&amp;#xFF0C;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/articles/show.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;% title @article.title %&amp;gt;   
&amp;lt;p class=&amp;quot;author&amp;quot;&amp;gt;from &amp;lt;%= @article.author %&amp;gt;&amp;lt;/p&amp;gt;   
&amp;lt;%= coderay(@article.content) %&amp;gt;   
&amp;lt;p&amp;gt;
&lt;/pre&gt;

&lt;p&gt;The helper method will go into our &lt;code&gt;application_helper&lt;/code&gt; file:&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/helpers/application_helper.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
# Methods added to this helper will be available to all templates in the application.   
module ApplicationHelper     
def coderay(text)   
  text.gsub(/\&amp;lt;code( lang=&amp;quot;(.+?)&amp;quot;)?\&amp;gt;(.+?)\&amp;lt;\/code\&amp;gt;/m) do  
    CodeRay.scan($3, $2).div(:css =&amp;gt; :class)   
  end  
end  
end  
&lt;/pre&gt;
  &lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;coderay&amp;#x65B9;&amp;#x6CD5;&amp;#x975E;&amp;#x5E38;&amp;#x7B80;&amp;#x5355;&amp;#xFF0C;&amp;#x5B83;&amp;#x63A5;&amp;#x53D7;&amp;#x4E00;&amp;#x6BB5;&amp;#x6587;&amp;#x672C;text&amp;#x4F5C;&amp;#x4E3A;&amp;#x53C2;&amp;#x6570;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E2A;text&amp;#x4E2D;&amp;#x53EF;&amp;#x80FD;&amp;#x5305;&amp;#x542B;&amp;#x9700;&amp;#x8981;&amp;#x9AD8;&amp;#x4EAE;&amp;#x663E;&amp;#x793A;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x7247;&amp;#x6BB5;&amp;#xFF0C;&amp;#x7528;text&amp;#x8C03;&amp;#x7528;&lt;code&gt;gsub&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x67E5;&amp;#x627E;&amp;#x5339;&amp;#x914D;&amp;#x4EE3;&amp;#x7801;&amp;#x6807;&amp;#x7B7E;&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#xFF0C;&amp;#x5E76;&amp;#x5C06;&amp;#x67E5;&amp;#x627E;&amp;#x5230;&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#x7528;&amp;#x4EE3;&amp;#x7801;&amp;#x5757;&amp;#x7684;&amp;#x8FD4;&amp;#x56DE;&amp;#x503C;&amp;#x66FF;&amp;#x6362;&amp;#x3002;&amp;#x5176;&amp;#x4E2D;&amp;#x7684;&amp;#x6B63;&amp;#x5219;&amp;#x8868;&amp;#x8FBE;&amp;#x5F0F;&amp;#x5C31;&amp;#x662F;&amp;#x7528;&amp;#x6765;&amp;#x67E5;&amp;#x627E;&amp;#x4EE5;&amp;#x27;&amp;lt;&lt;code&gt;code&lt;/code&gt;&amp;#x27;&amp;#x5F00;&amp;#x5934;&amp;#x5E76;&amp;#x62E5;&amp;#x6709;&amp;#x27;&lt;code&gt;lang&lt;/code&gt;&amp;#x27;&amp;#x5C5E;&amp;#x6027;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x6807;&amp;#x7B7E;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x5339;&amp;#x914D;&amp;#x4F4D;&amp;#x4E8E;&amp;#x4EE3;&amp;#x7801;&amp;#x6807;&amp;#x7B7E;&amp;#x5F00;&amp;#x59CB;&amp;#xFF08;&lt;code&gt;&amp;lt;code lang=&lt;/code&gt;&amp;#xFF09;&amp;#x548C;&amp;#x7ED3;&amp;#x675F;&amp;#xFF08;&lt;code&gt;&amp;lt;/code&amp;gt;&lt;/code&gt;&amp;#xFF09;&amp;#x4E4B;&amp;#x95F4;&amp;#x90E8;&amp;#x5206;&amp;#x3002;&amp;#x4EE3;&amp;#x7801;&amp;#x5757;&amp;#x7684;&amp;#x5185;&amp;#x90E8;&amp;#x8C03;&amp;#x7528;&amp;#x4E86;&lt;code&gt;CodeRay.scan&lt;/code&gt; &amp;#x65B9;&amp;#x6CD5;&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&amp;#x65B9;&amp;#x6CD5;&amp;#x63A5;&amp;#x53D7;&amp;#x4E00;&amp;#x6BB5;&amp;#x6587;&amp;#x672C;&amp;#x548C;&amp;#x8BED;&amp;#x8A00;&amp;#x4F5C;&amp;#x4E3A;&amp;#x53C2;&amp;#x6570;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#x6211;&amp;#x4EEC;&amp;#x4F20;&amp;#x9012;&amp;#x4E86;&lt;code&gt;$3&lt;/code&gt;&amp;#x548C;&lt;code&gt;$2&lt;/code&gt;&amp;#x7ED9;&amp;#x5B83;&amp;#xFF0C;&lt;code&gt;$3&lt;/code&gt;&amp;#x662F;&amp;#x6B63;&amp;#x5219;&amp;#x8868;&amp;#x8FBE;&amp;#x5F0F;&amp;#x5339;&amp;#x914D;&amp;#x51FA;&amp;#x6765;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x6807;&amp;#x7B7E;&amp;#x4E4B;&amp;#x95F4;&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&lt;code&gt;(/\&amp;lt;code( lang=&amp;quot;(.+?)&amp;quot;)?\&amp;gt;(.+?)\&amp;lt;\/code\&amp;gt;/m)&lt;/code&gt;&amp;#xFF0C;&lt;code&gt;$2&lt;/code&gt;&amp;#x662F;&amp;#x6B63;&amp;#x5219;&amp;#x8868;&amp;#x8FBE;&amp;#x5F0F;&amp;#x4E2D;&amp;#x5339;&amp;#x914D;&amp;#x51FA;&amp;#x6765;&amp;#x7684;&amp;#x5C5E;&amp;#x6027;&lt;code&gt;lang&lt;/code&gt;&amp;#x7684;&amp;#x503C;&lt;code&gt;(/\&amp;lt;code( lang=&amp;quot;(.+?)&amp;quot;)?\&amp;gt;(.+?)\&amp;lt;\/code\&amp;gt;/m)&lt;/code&gt;&amp;#x3002;&amp;#x63A5;&amp;#x7740;&amp;#x4EE3;&amp;#x7801;&amp;#x5757;&amp;#x8C03;&amp;#x7528;&amp;#x4E86;&lt;code&gt;.div&lt;/code&gt; &amp;#xFF0C;&amp;#x5C06;&amp;#x524D;&amp;#x9762;&amp;#x7684;&amp;#x8FD4;&amp;#x56DE;&amp;#x503C;&amp;#x5305;&amp;#x542B;&amp;#x5728;&amp;#x4E00;&amp;#x4E2A;div&amp;#x6807;&amp;#x7B7E;&amp;#x4E2D;&amp;#x3002;&lt;code&gt;:css =&amp;gt; :class&lt;/code&gt; &amp;#x9009;&amp;#x9879;&amp;#x544A;&amp;#x8BC9;CodeRay&amp;#x91C7;&amp;#x7528;&amp;#x4EC0;&amp;#x4E48;&amp;#x7C7B;&amp;#x578B;&amp;#x7684;CSS&amp;#x6837;&amp;#x5F0F;&amp;#x3002;CodeRay&amp;#x6709;&amp;#x8BB8;&amp;#x591A;&amp;#x4E0D;&amp;#x540C;&amp;#x7684;&amp;#x9009;&amp;#x9879;&amp;#x7528;&amp;#x6765;&amp;#x63A7;&amp;#x5236;&amp;#x8F93;&amp;#x51FA;&amp;#x5185;&amp;#x5BB9;&amp;#x7684;&amp;#x7ED3;&amp;#x6784;&amp;#x548C;&amp;#x6837;&amp;#x5F0F;&amp;#x3002;&amp;#x66F4;&amp;#x591A;&amp;#x8BE6;&amp;#x7EC6;&amp;#x4FE1;&amp;#x606F;&amp;#x8BF7;&amp;#x67E5;&amp;#x770B;&amp;#x8FD9;&amp;#x4E2A;&lt;a href="http://coderay.rubychan.de/doc/"&gt;&amp;#x6587;&amp;#x6863;&lt;/a&gt;&amp;#x3002;&lt;/p&gt;
  &lt;p&gt;&amp;#x6700;&amp;#x540E;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x5F20;&amp;#x6837;&amp;#x5F0F;&amp;#x8868;&amp;#xFF0C;&amp;#x8BBE;&amp;#x7F6E;CodeRay&amp;#x6BCF;&amp;#x4E2A;&amp;#x7C7B;&amp;#x7684;&amp;#x6837;&amp;#x5F0F;&amp;#x3002;Ryan Bates&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x4E2A;&amp;#x7C7B;&amp;#x4F3C;Railscasts&amp;#x4E3B;&amp;#x9898;&amp;#x7684;&amp;#x6837;&amp;#x5F0F;&amp;#x8868;&amp;#x6587;&amp;#x4EF6;&amp;#xFF0C;&amp;#x4F60;&amp;#x53EF;&amp;#x4EE5;&amp;#x4ECE;Github&amp;#x4E0A;&lt;a href="http://github.com/ryanb/railscasts-episodes/blob/master/episode-207/blog/public/stylesheets/coderay.css"&gt;&amp;#x4E0B;&amp;#x8F7D;&lt;/a&gt;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x5219;&amp;#x62F7;&amp;#x8D1D;&amp;#x4E00;&amp;#x4EFD;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#xFF0C;&amp;#x628A;&amp;#x5B83;&amp;#x653E;&amp;#x5230;&amp;#x9879;&amp;#x76EE;&amp;#x76EE;&amp;#x5F55;&lt;code&gt;/public/stylesheets&lt;/code&gt; &amp;#x4E2D;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/public/stylesheets/coderay.css&lt;/p&gt;
&lt;pre class="css"&gt;
.CodeRay {   
background-color: #232323;   
border: 1px solid black;   
font-family: &amp;#x27;Courier New&amp;#x27;, &amp;#x27;Terminal&amp;#x27;, monospace;   
color: #E6E0DB;   
padding: 3px 5px;   
overflow: auto;   
font-size: 12px;   
margin: 12px 0;   
}   
.CodeRay pre {   
margin: 0px;   
padding: 0px;   
}   

.CodeRay .an { color:#E7BE69 }                      /* html &amp;#x5C5E;&amp;#x6027;*/  
.CodeRay .c  { color:#BC9358; font-style: italic; } /* &amp;#x6CE8;&amp;#x91CA; */  
.CodeRay .ch { color:#509E4F }                      /* &amp;#x8F6C;&amp;#x4E49;&amp;#x5B57;&amp;#x7B26; */  
.CodeRay .cl { color:#FFF }                         /* &amp;#x7C7B; */  
.CodeRay .co { color:#FFF }                         /* &amp;#x5E38;&amp;#x6570; */  
.CodeRay .fl { color:#A4C260 }                      /* &amp;#x6D6E;&amp;#x70B9;&amp;#x6570; */  
.CodeRay .fu { color:#FFC56D }                      /* &amp;#x65B9;&amp;#x6CD5; */  
.CodeRay .gv { color:#D0CFFE }                      /* &amp;#x5168;&amp;#x5C40;&amp;#x53D8;&amp;#x91CF; */  
.CodeRay .i  { color:#A4C260 }                      /* &amp;#x6574;&amp;#x578B; */  
.CodeRay .il { background:#151515 }                 /* &amp;#x5185;&amp;#x8054;&amp;#x4EE3;&amp;#x7801; */  
.CodeRay .iv { color:#D0CFFE }                      /* &amp;#x5B9E;&amp;#x4F8B;&amp;#x53D8;&amp;#x91CF; */  
.CodeRay .pp { color:#E7BE69 }                      /* &amp;#x6587;&amp;#x6863;&amp;#x7C7B;&amp;#x578B; */  
.CodeRay .r  { color:#CB7832 }                      /* &amp;#x5173;&amp;#x952E;&amp;#x5B57; */  
.CodeRay .rx { color:#A4C260 }                      /* &amp;#x6B63;&amp;#x5219;&amp;#x8868;&amp;#x8FBE;&amp;#x5F0F; */  
.CodeRay .s  { color:#A4C260 }                      /* &amp;#x5B57;&amp;#x7B26;&amp;#x4E32; */  
.CodeRay .sy { color:#6C9CBD }                      /* &amp;#x7B26;&amp;#x53F7; */  
.CodeRay .ta { color:#E7BE69 }                      /* html &amp;#x6807;&amp;#x7B7E; */  
.CodeRay .pc { color:#6C9CBD }                      /* &amp;#x5E03;&amp;#x5C14;&amp;#x578B; */  
&lt;/pre&gt;
&lt;p&gt;&amp;#x9AD8;&amp;#x4EAE;&amp;#x663E;&amp;#x793A;&amp;#x7684;&amp;#x6E90;&amp;#x4EE3;&amp;#x7801;&amp;#x4E2D;&amp;#x6BCF;&amp;#x4E00;&amp;#x79CD;&amp;#x6807;&amp;#x8BB0;&amp;#x7B26;&amp;#x53F7;&amp;#x90FD;&amp;#x6709;&amp;#x76F8;&amp;#x5E94;&amp;#x7684;CSS&amp;#x7C7B;&amp;#x9009;&amp;#x62E9;&amp;#x5668;&amp;#xFF0C;&amp;#x4E0A;&amp;#x9762;&amp;#x4EE3;&amp;#x7801;&amp;#x4E2D;&amp;#x7684;&amp;#x989C;&amp;#x8272;&amp;#x53EF;&amp;#x4EE5;&amp;#x6839;&amp;#x636E;&amp;#x4F60;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x7684;&amp;#x9700;&amp;#x8981;&amp;#x968F;&amp;#x610F;&amp;#x6539;&amp;#x53D8;&amp;#x3002;&lt;/p&gt;
&lt;p&gt;&amp;#x4E3A;&amp;#x4E86;&amp;#x4F7F;&amp;#x6837;&amp;#x5F0F;&amp;#x8868;&amp;#x6587;&amp;#x4EF6;&amp;#x8D77;&amp;#x4F5C;&amp;#x7528;&amp;#xFF0C;&amp;#x9700;&amp;#x8981;&amp;#x5728;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;layout&amp;#x5E03;&amp;#x5C40;&amp;#x6587;&amp;#x4EF6;&amp;#x7684;&amp;#x5934;&amp;#x90E8;&amp;#x5C06;&amp;#x6837;&amp;#x5F0F;&amp;#x8868;&amp;#x6587;&amp;#x4EF6;&amp;#x5305;&amp;#x542B;&amp;#x8FDB;&amp;#x6765;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/layouts/application.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;%= stylesheet_link_tag &amp;#x27;blog&amp;#x27;, &amp;#x27;coderay&amp;#x27; %&amp;gt;  
&lt;/pre&gt;
&lt;p&gt;&amp;#x505A;&amp;#x5B8C;&amp;#x8FD9;&amp;#x4E9B;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x7F16;&amp;#x8F91;&amp;#x4E00;&amp;#x7BC7;&amp;#x6587;&amp;#x7AE0;&amp;#x540E;&amp;#xFF0C;&amp;#x67E5;&amp;#x770B;&amp;#x6587;&amp;#x7AE0;&amp;#x65F6;&amp;#x5C31;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;#x9AD8;&amp;#x4EAE;&amp;#x663E;&amp;#x793A;&amp;#x7684;&amp;#x90E8;&amp;#x5206;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
&lt;img src="/system/photos/356/original/E207I02.png" width="815" height="420" alt="The code snippet is now highlighted."/&gt;
&lt;/div&gt;

&lt;h3&gt;&amp;#x4F7F;&amp;#x7528;Textile&lt;/h3&gt;

&lt;p&gt;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x901A;&amp;#x5E38;&amp;#x548C;&amp;#x7B80;&amp;#x5355;&amp;#x6807;&amp;#x8BB0;&amp;#x8BED;&amp;#x8A00;&amp;#x8054;&amp;#x5408;&amp;#x4F7F;&amp;#x7528;&amp;#xFF0C;&amp;#x5982;Textile&amp;#x548C;Markdown&amp;#x3002;&amp;#x8981;&amp;#x5728;&amp;#x6587;&amp;#x7AE0;&amp;#x4E2D;&amp;#x4F7F;&amp;#x7528;Textile&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;&amp;#x89C6;&amp;#x56FE;&amp;#x6587;&amp;#x4EF6;&lt;code&gt;show&lt;/code&gt; &amp;#x4E2D;&amp;#x8C03;&amp;#x7528;&lt;code&gt;textilize&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x5E76;&amp;#x5C06;&lt;code&gt;coderay&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;&amp;#x8FD4;&amp;#x56DE;&amp;#x503C;&amp;#x4F5C;&amp;#x4E3A;&amp;#x53C2;&amp;#x6570;&amp;#x4F20;&amp;#x9012;&amp;#x7ED9;&lt;code&gt;textilize&lt;/code&gt;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/articles/show.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;%= textilize(coderay(@article.content)) %&amp;gt; 
&lt;/pre&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x4E0D;&amp;#x5E0C;&amp;#x671B;&lt;code&gt;coderay&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;&amp;#x8FD4;&amp;#x56DE;&amp;#x503C;&amp;#x88AB;RedCloth&amp;#x89E3;&amp;#x6790;&amp;#xFF0C;&amp;#x53EA;&amp;#x9700;&amp;#x8981;&amp;#x7A0D;&amp;#x5FAE;&amp;#x6539;&amp;#x52A8;coderay&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x5C06;&amp;#x5176;&amp;#x8FD4;&amp;#x56DE;&amp;#x503C;&amp;#x653E;&amp;#x5165;&amp;#x4E00;&amp;#x4E2A;&lt;code&gt;notextile&lt;/code&gt;&amp;#x5143;&amp;#x7D20;&amp;#x4E2D;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x5C31;&amp;#x4E0D;&amp;#x4F1A;&amp;#x88AB;&amp;#x89E3;&amp;#x6790;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/helpers/application_helper.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
def coderay(text)   
text.gsub(/\&amp;lt;code( lang=&amp;quot;(.+?)&amp;quot;)?\&amp;gt;(.+?)\&amp;lt;\/code\&amp;gt;/m) do  
  content_tag(&amp;quot;notextile&amp;quot;, CodeRay.scan($3, $2).div(:css =&amp;gt; :class))   
end  
end 
&lt;/pre&gt; 

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x91CD;&amp;#x65B0;&amp;#x7F16;&amp;#x8F91;&amp;#x6587;&amp;#x7AE0;&amp;#xFF0C;&amp;#x52A0;&amp;#x5165;&amp;#x4E00;&amp;#x4E9B;&amp;#x6807;&amp;#x8BB0;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x50CF;&amp;#x8FD9;&amp;#x6837;&amp;#xFF1A;&lt;/p&gt;
&lt;pre class="terminal"&gt;
The piano is a musical instrument played by means of a keyboard that produces sound by striking steel strings with felt hammers. The hammers immediately rebound allowing the strings to continue vibrating at their resonant frequency. These vibrations are transmitted through a bridge to a soundboard that amplifies them.

* item
* item 2

&amp;lt;code lang=&amp;quot;ruby&amp;quot;&amp;gt;
def hello
puts &amp;#x27;Hello, world!&amp;#x27;
end
&amp;lt;/code&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x73B0;&amp;#x5728;&amp;#x6587;&amp;#x7AE0;&amp;#x4E2D;&amp;#x5C31;&amp;#x4F1A;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;Textile&amp;#x751F;&amp;#x6210;&amp;#x7684;&amp;#x65E0;&amp;#x5E8F;&amp;#x5217;&amp;#x8868;&amp;#x548C;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x663E;&amp;#x793A;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x7247;&amp;#x6BB5;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
&lt;img src="/system/photos/357/original/E207I03.png" width="838" height="471" alt="The Textile code is now parsed too."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x4E0A;&amp;#x9762;&amp;#x5C31;&amp;#x662F;&amp;#x672C;&amp;#x671F;&amp;ldquo;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;rdquo;&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#x3002;CodeRay&amp;#x4F7F;Rails&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4E2D;&amp;#x9AD8;&amp;#x4EAE;&amp;#x663E;&amp;#x793A;&amp;#x4EE3;&amp;#x7801;&amp;#x7247;&amp;#x6BB5;&amp;#x53D8;&amp;#x5F97;&amp;#x5BB9;&amp;#x6613;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x9700;&amp;#x8981;&amp;#x8BED;&amp;#x6CD5;&amp;#x9AD8;&amp;#x4EAE;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#xFF0C;&amp;#x503C;&amp;#x5F97;&amp;#x597D;&amp;#x597D;&amp;#x7814;&amp;#x7A76;&amp;#x4E00;&amp;#x4E0B;&amp;#x3002;&lt;/p&gt;</description>
      <pubDate>Fri, 02 Apr 2010 13:43:25 +0000</pubDate>
      <guid>http://cn.asciicasts.com/episodes/207-syntax-highlighting</guid>
      <link>http://cn.asciicasts.com/episodes/207-syntax-highlighting</link>
    </item>
    <item>
      <title>ActionMailer in Rails 3</title>
      <description>&lt;p&gt;ActionMailer&amp;#x5728;Rails3.0&amp;#x91CC;&amp;#x9762;&amp;#x6709;&amp;#x5F88;&amp;#x5927;&amp;#x7684;&amp;#x53D8;&amp;#x5316;&amp;#x3002;ActionMailer&amp;#x5728;Rails3.0&amp;#x91CC;&amp;#x9762;&amp;#x4F7F;&amp;#x7528;&amp;#x66F4;&amp;#x597D;&amp;#x7528;&amp;#x7684;&lt;a href="http://lindsaar.net/2010/1/23/mail-gem-version-2-released"&gt;Mail&lt;/a&gt; gem &amp;#x66FF;&amp;#x4EE3;&amp;#x4E4B;&amp;#x524D;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;TMail gem&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x7684;Rails 3 &amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x6765;&amp;#x6F14;&amp;#x793A;&amp;#x8FD9;&amp;#x4E2A;ActionMailer&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x628A;&amp;#x8FD9;&amp;#x4E2A;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x53EB;&amp;#x505A;&amp;#xFF1A;&lt;code&gt;mailit&lt;/code&gt;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
rails mailit
&lt;/pre&gt;

&lt;p&gt;&amp;#x63A5;&amp;#x4E0B;&amp;#x6765;&amp;#x6211;&amp;#x4EEC;&amp;#x4E3A;&amp;#x4E00;&amp;#x4E2A;&lt;code&gt;User&lt;/code&gt;&amp;#x6A21;&amp;#x578B;&amp;#x521B;&amp;#x5EFA;&amp;#x811A;&amp;#x624B;&amp;#x67B6;(scaffold)&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6A21;&amp;#x578B;&amp;#x6709;&amp;#x4E24;&amp;#x4E2A;&amp;#x5C5E;&amp;#x6027;&amp;#xFF1A;&lt;code&gt;name&lt;/code&gt;&amp;#x548C;&lt;code&gt;email&lt;/code&gt;&amp;#xFF0C;&amp;#x7528;&amp;#x6765;&amp;#x6F14;&amp;#x793A;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x7528;&amp;#x6237;&amp;#x6CE8;&amp;#x518C;&amp;#x9875;&amp;#x9762;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
rails g scaffold user name:string email:string
&lt;/pre&gt;

&lt;p&gt;&amp;#x7136;&amp;#x540E;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD0;&amp;#x884C;&amp;#x6570;&amp;#x636E;&amp;#x5E93;&amp;#x8FC1;&amp;#x79FB;(migrations):&lt;/p&gt;

&lt;pre class="terminal"&gt;
rake db:migrate
&lt;/pre&gt;

&lt;p&gt;&amp;#x521A;&amp;#x624D;&amp;#x751F;&amp;#x6210;&amp;#x7684;&amp;#x811A;&amp;#x624B;&amp;#x67B6;(scaffolding)&amp;#x4EE3;&amp;#x7801;&amp;#x5305;&amp;#x62EC;&amp;#x4E00;&amp;#x4E2A;&amp;#x521B;&amp;#x5EFA;&amp;#x7528;&amp;#x6237;&amp;#x7684;&amp;#x9875;&amp;#x9762;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x5E0C;&amp;#x671B;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x5728;&amp;#x8FD9;&amp;#x4E2A;&amp;#x8868;&amp;#x5355;(form)&amp;#x63D0;&amp;#x4EA4;&amp;#x540E;&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x7528;&amp;#x6237;&amp;#x5E76;&amp;#x4E14;&amp;#x53D1;&amp;#x9001;&amp;#x4E00;&amp;#x5C01;&amp;#x786E;&amp;#x8BA4;&amp;#x4FE1;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/348/original/E206I01.png" width="796" height="315" alt="The user registration form."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x9996;&amp;#x5148;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x505A;&amp;#x7684;&amp;#x662F;&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x7684;&amp;#x521D;&amp;#x59CB;&amp;#x5316;&amp;#x6587;&amp;#x4EF6;(initializer file)&amp;#x5E76;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E9B;&amp;#x914D;&amp;#x7F6E;&amp;#x4FE1;&amp;#x606F;,&amp;#x6211;&amp;#x4EEC;&amp;#x628A;&amp;#x5B83;&amp;#x547D;&amp;#x540D;&amp;#x4E3A;&lt;code&gt;setup_mail.rb&lt;/code&gt;&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x653E;&amp;#x5728;/config/initializers&amp;#x76EE;&amp;#x5F55;&amp;#x4E0B;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x7684;&amp;#x673A;&amp;#x5668;&amp;#x91CC;&amp;#x9762;&amp;#x5DF2;&amp;#x7ECF;&amp;#x5B89;&amp;#x88C5;&amp;#x5E76;&amp;#x914D;&amp;#x7F6E;&amp;#x4E86;sendmail&amp;#xFF0C;ActionMailer&amp;#x4F1A;&amp;#x4F7F;&amp;#x7528;sendmail&amp;#x53D1;&amp;#x9001;&amp;#x90AE;&amp;#x4EF6;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;initializer&amp;#x4E2D;&amp;#x6307;&amp;#x5B9A;SMTP&amp;#x8BBE;&amp;#x7F6E;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/config/initializers/setup_mail.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
ActionMailer::Base.smtp_settings = {
  :address              =&amp;gt; &amp;quot;smtp.gmail.com&amp;quot;,
  :port                 =&amp;gt; 587,
  :domain               =&amp;gt; &amp;quot;asciicasts.com&amp;quot;,
  :user_name            =&amp;gt; &amp;quot;asciicasts&amp;quot;,
  :password             =&amp;gt; &amp;quot;secret&amp;quot;,
  :authentication       =&amp;gt; &amp;quot;plain&amp;quot;,
  :enable_starttls_auto =&amp;gt; true
}
&lt;/pre&gt;

&lt;p&gt;&amp;#x4E5F;&amp;#x8BB8;&amp;#x4F60;&amp;#x60F3;&amp;#x7528;&amp;#x5728;&amp;#x751F;&amp;#x4EA7;&amp;#x73AF;&amp;#x5883;&amp;#x4E0B;(production environment)&amp;#x4F7F;&amp;#x7528;&amp;#x53E6;&amp;#x5916;&amp;#x7684;&amp;#x53D1;&amp;#x9001;&amp;#x65B9;&amp;#x5F0F;&amp;#x3002;&amp;#x4F46;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x6B63;&amp;#x5728;&amp;#x5F00;&amp;#x53D1;&amp;#x9636;&amp;#x6BB5;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E2A;&amp;#x65B9;&amp;#x5F0F;&amp;#x5DF2;&amp;#x7ECF;&amp;#x8DB3;&amp;#x591F;&amp;#x4E86;&amp;#x3002;&amp;#x4F60;&amp;#x9700;&amp;#x8981;&amp;#x53BB;&amp;#x6839;&amp;#x636E;&amp;#x4F60;&amp;#x81EA;&amp;#x5DF1;&amp;#x7684;Gmail&amp;#x5E10;&amp;#x53F7;&amp;#x4FE1;&amp;#x606F;&amp;#x53BB;&amp;#x4FEE;&amp;#x6539;&lt;code&gt;domain&lt;/code&gt;,&lt;code&gt;user_name&lt;/code&gt;,&amp;#x548C;&lt;code&gt;password&lt;/code&gt;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x6837;&amp;#x6211;&amp;#x4EEC;&amp;#x5DF2;&amp;#x7ECF;&amp;#x5B8C;&amp;#x6210;&amp;#x4E86;&amp;#x914D;&amp;#x7F6E;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;&amp;#x4E0B;&amp;#x9762;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x53BB;&amp;#x751F;&amp;#x6210;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x7684;mailer&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
rails g mailer user_mailer
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;&amp;#x547D;&amp;#x4EE4;&amp;#x4F1A;&amp;#x5E2E;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&lt;code&gt;/app/mailers&lt;/code&gt;&amp;#x76EE;&amp;#x5F55;&amp;#x4E0B;&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x7684;&lt;code&gt;user_mailer.rb&lt;/code&gt;&amp;#x6587;&amp;#x4EF6;&amp;#x3002;&amp;#x65E9;&amp;#x671F;&amp;#x7248;&amp;#x672C;&amp;#x7684;Rails&amp;#x4F1A;&amp;#x628A;mailer&amp;#x7C7B;&amp;#x6587;&amp;#x4EF6;&amp;#x90FD;&amp;#x653E;&amp;#x5728;&lt;code&gt;/app/models&lt;/code&gt;&amp;#x6587;&amp;#x4EF6;&amp;#x5939;&amp;#x91CC;&amp;#x9762;&amp;#xFF0C;&amp;#x5728;Rails 3&amp;#x4ED6;&amp;#x4EEC;&amp;#x88AB;&amp;#x653E;&amp;#x5728;&amp;#x81EA;&amp;#x5DF1;&amp;#x7684;&amp;#x6587;&amp;#x4EF6;&amp;#x5939;&amp;#x91CC;&amp;#x9762;(&amp;#x8BD1;&amp;#x8005;&amp;#x6CE8;&amp;#xFF1A;/app/mailer)&amp;#x3002;Mailers&amp;#x5728;Rails 3&amp;#x50CF;&amp;#x63A7;&amp;#x5236;&amp;#x5668;(controller)&amp;#xFF0C;&amp;#x5E76;&amp;#x4E14;Mailers&amp;#x548C;&amp;#x63A7;&amp;#x5236;&amp;#x5668;&amp;#x5171;&amp;#x4EAB;&amp;#x5F88;&amp;#x591A;&amp;#x5E95;&amp;#x5C42;&amp;#x4EE3;&amp;#x7801;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;UserMailer&amp;#x7C7B;&amp;#x7684;&amp;#x9ED8;&amp;#x8BA4;&amp;#x4EE3;&amp;#x7801;&amp;#x770B;&amp;#x8D77;&amp;#x6765;&amp;#x50CF;&amp;#x8FD9;&amp;#x6837;(/app/mailers/user_mailer.rb)&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/mailers/user_mailer.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class UserMailer &amp;lt; ActionMailer::Base
  default :from =&amp;gt; &amp;quot;from@example.com&amp;quot;
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x73B0;&amp;#x5728;&amp;#x628A;&lt;code&gt;default&lt;/code&gt;&amp;#x90A3;&amp;#x884C;&amp;#x4EE3;&amp;#x7801;&amp;#x5220;&amp;#x6389;&amp;#xFF0C;&amp;#x5728;&amp;#x540E;&amp;#x9762;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x89E3;&amp;#x91CA;&amp;#x8FD9;&amp;#x884C;&amp;#x4EE3;&amp;#x7801;&amp;#x7684;&amp;#x7528;&amp;#x9014;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5C31;&amp;#x50CF;Rails 2&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x91CC;&amp;#x9762;&amp;#x4E00;&amp;#x6837;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4E3A;&amp;#x6BCF;&amp;#x4E2A;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x53D1;&amp;#x9001;&amp;#x7684;email&amp;#x7C7B;&amp;#x578B;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B9;&amp;#x6CD5;&amp;#x3002;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x4F8B;&amp;#x5B50;&amp;#x91CC;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E2A;&amp;#x53EB;&amp;#x505A; &lt;code&gt;registration_confirmation&lt;/code&gt;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/mailers/user_mailer.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class UserMailer &amp;lt; ActionMailer::Base
  def registration_confirmation(user)
    mail(:to =&amp;gt; user.email, :subject =&amp;gt; &amp;quot;Registered&amp;quot;, :from =&amp;gt; &amp;quot;eifion@asciicasts.com&amp;quot;)
  end
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x7ED9;&lt;code&gt;registration_confirmation&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x4F20;&amp;#x9012;&amp;#x4E00;&amp;#x4E2A;&lt;code&gt;User&lt;/code&gt;&amp;#x5BF9;&amp;#x8C61;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x505A;&amp;#x7684;&amp;#x4EC5;&amp;#x4EC5;&amp;#x662F;&amp;#x8C03;&amp;#x7528;mail&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x7ED9;mail&amp;#x65B9;&amp;#x6CD5;&amp;#x4F20;&amp;#x9012;&lt;code&gt;:to&lt;/code&gt;,&lt;code&gt;:from&lt;/code&gt;&amp;#x548C;&lt;code&gt;:subject&lt;/code&gt;&amp;#x4E4B;&amp;#x7C7B;&amp;#x7684;&amp;#x53C2;&amp;#x6570;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x7C7B;&amp;#x91CC;&amp;#x9762;&amp;#x6709;&amp;#x591A;&amp;#x4E2A;&amp;#x5171;&amp;#x4EAB;&amp;#x76F8;&amp;#x5173;&amp;#x8BBE;&amp;#x7F6E;&amp;#x7684;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x628A;&amp;#x8FD9;&amp;#x4E9B;&amp;#x5171;&amp;#x4EAB;&amp;#x503C;&amp;#x653E;&amp;#x5728;&amp;#x4E4B;&amp;#x524D;&amp;#x6211;&amp;#x4EEC;&amp;#x5220;&amp;#x9664;&amp;#x7684;default&amp;#x65B9;&amp;#x6CD5;&amp;#x91CC;&amp;#x9762;&amp;#x3002;&amp;#x6BD4;&amp;#x65B9;&amp;#x8BF4;email&amp;#x603B;&amp;#x662F;&amp;#x4ECE;&amp;#x540C;&amp;#x6837;&amp;#x7684;&amp;#x5730;&amp;#x65B9;&amp;#x53D1;&amp;#x9001;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x628A;:from&amp;#x8BBE;&amp;#x7F6E;&amp;#x653E;&amp;#x5230;default&amp;#x91CC;&amp;#x9762;:&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/mailers/user_mailer.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class UserMailer &amp;lt; ActionMailer::Base
  default :from =&amp;gt; &amp;quot;eifion@asciicasts.com&amp;quot;

  def registration_confirmation(user)
    mail(:to =&amp;gt; user.email, :subject =&amp;gt; &amp;quot;Registered&amp;quot;)
  end
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x628A;&amp;#x4EFB;&amp;#x4F55;&amp;#x51C6;&amp;#x5907;&amp;#x5171;&amp;#x4EAB;&amp;#x7684;&amp;#x8BBE;&amp;#x5B9A;(&amp;#x4EFB;&amp;#x4F55;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;&lt;code&gt;mail&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x91CC;&amp;#x9762;&amp;#x8BBE;&amp;#x5B9A;&amp;#x7684;&amp;#x503C;)&amp;#x62BD;&amp;#x51FA;&amp;#x6765;&amp;#x653E;&amp;#x5728;&lt;code&gt;default&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x91CC;&amp;#x9762;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x7C7B;&amp;#x4F3C;controllers&amp;#xFF0C;mail&amp;#x9700;&amp;#x8981;&amp;#x6709;&amp;#x76F8;&amp;#x5BF9;&amp;#x4E8E;&amp;#x7684;&amp;#x89C6;&amp;#x56FE;(view)&amp;#x6587;&amp;#x4EF6;&amp;#x3002; &amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x6CE8;&amp;#x518C;&amp;#x786E;&amp;#x8BA4;&amp;#x90AE;&amp;#x4EF6;&amp;#x7684;&amp;#x89C6;&amp;#x56FE;&amp;#x6587;&amp;#x4EF6;&amp;#x653E;&amp;#x5728;&lt;code&gt;/app/views/user_mailer&lt;/code&gt;&amp;#x6587;&amp;#x4EF6;&amp;#x5939;&amp;#x5185;&amp;#x3002; &amp;#x6211;&amp;#x4EEC;&amp;#x51C6;&amp;#x5907;&amp;#x7528;&amp;#x7EAF;&amp;#x6587;&amp;#x672C;&amp;#x7684;&amp;#x5F62;&amp;#x5F0F;&amp;#x53D1;&amp;#x9001;&amp;#x90AE;&amp;#x4EF6;&amp;#xFF0C;&amp;#x56E0;&amp;#x6B64;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x6587;&amp;#x4EF6;&amp;#x540D;&amp;#x53EB;&amp;#x505A;&lt;code&gt;registration_confirmation.text.erb&lt;/code&gt;&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x91CC;&amp;#x9762;&amp;#x7684;&amp;#x4EFB;&amp;#x4F55;&amp;#x5185;&amp;#x5BB9;&amp;#x90FD;&amp;#x5C06;&amp;#x4F5C;&amp;#x4E3A;email&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#x663E;&amp;#x793A;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/usermailer/registration_confimration.text.erb:&lt;/p&gt;
&lt;pre class="erb"&gt;
Thank you for registering!
&lt;/pre&gt;

&lt;p&gt;&amp;#x63A5;&amp;#x4E0B;&amp;#x6765;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x5199;&amp;#x4E9B;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E9B;&amp;#x4EE3;&amp;#x7801;&amp;#x5B9E;&amp;#x73B0;&amp;#x5F53;&amp;#x521B;&amp;#x5EFA;&amp;#x7528;&amp;#x6237;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x53D1;&amp;#x9001;&amp;#x90AE;&amp;#x4EF6;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&amp;#x6709;&amp;#x4E9B;&amp;#x4EBA;&amp;#x559C;&amp;#x6B22;&amp;#x4F7F;&amp;#x7528;&lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Observer.html"&gt;Model Observer&lt;/a&gt;&amp;#x53BB;&amp;#x5B9E;&amp;#x73B0;&amp;#xFF0C;&amp;#x4F46;&amp;#x6211;&amp;#x4EEC;&amp;#x51C6;&amp;#x5907;&amp;#x76F4;&amp;#x63A5;&amp;#x5728;controller&amp;#x5C42;&amp;#x91CC;&amp;#x9762;&amp;#x5B9E;&amp;#x73B0;&amp;#x3002; &amp;#x6211;&amp;#x4EEC;&amp;#x8FD9;&amp;#x6837;&amp;#x505A;&amp;#x7684;&amp;#x7406;&amp;#x7531;&amp;#x662F;&amp;#xFF1A; &amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F7F;&amp;#x7528;&amp;#x89C2;&amp;#x5BDF;&amp;#x8005;(observer), &amp;#x90A3;&amp;#x4E48;&amp;#x6211;&amp;#x4EEC;&amp;#x5982;&amp;#x679C;&amp;#x5728;Rails&amp;#x547D;&amp;#x4EE4;&amp;#x884C;(console)&amp;#x91CC;&amp;#x9762;&amp;#x521B;&amp;#x5EFA;User&amp;#x5BF9;&amp;#x8C61;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x540E;&amp;#x53F0;&amp;#x4E5F;&amp;#x4F1A;&amp;#x53D1;&amp;#x9001;email&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x53EA;&amp;#x60F3;&amp;#x7528;&amp;#x6237;&amp;#x5728;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x91CC;&amp;#x9762;&amp;#x521B;&amp;#x5EFA;&amp;#x65F6;&amp;#x53D1;&amp;#x9001;email&amp;#x3002;&amp;#x56E0;&amp;#x6B64;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x628A;&amp;#x5B9E;&amp;#x73B0;&amp;#x4EE3;&amp;#x7801;&amp;#x653E;&amp;#x5728;controller&amp;#x91CC;&amp;#x9762;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&lt;code&gt;UsersController&lt;/code&gt;&amp;#x7684;&lt;code&gt;create&lt;/code&gt; action&amp;#x91CC;&amp;#x9762;&amp;#x6DFB;&amp;#x52A0;&amp;#x53D1;&amp;#x9001;email&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x6240;&amp;#x9700;&amp;#x8981;&amp;#x505A;&amp;#x7684;&amp;#x4EC5;&amp;#x4EC5;&amp;#x662F;&amp;#x8C03;&amp;#x7528;&amp;#x6211;&amp;#x4EEC;&amp;#x521A;&amp;#x521A;&amp;#x5199;&amp;#x7684;&lt;code&gt;registration_confirmation&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x628A;&amp;#x65B0;&amp;#x521B;&amp;#x5EFA;&amp;#x7684;user&amp;#x4F5C;&amp;#x4E3A;&amp;#x53C2;&amp;#x6570;&amp;#x4F20;&amp;#x9012;&amp;#x8FDB;&amp;#x53BB;&amp;#xFF0C;&amp;#x6700;&amp;#x540E;&amp;#x8C03;&amp;#x7528;&lt;code&gt;deliver&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x53D1;&amp;#x9001;email&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/controllers/users_controller.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
def create
  @user = User.new(params[:user])

  respond_to do |format|
    if @user.save
      UserMailer.registration_confirmation(@user).deliver
      format.html { redirect_to(@user, :notice =&amp;gt; &amp;#x27;User was successfully created.&amp;#x27;) }
      format.xml  { render :xml =&amp;gt; @user, :status =&amp;gt; :created, :location =&amp;gt; @user }
    else
      format.html { render :action =&amp;gt; &amp;quot;new&amp;quot; }
      format.xml  { render :xml =&amp;gt; @user.errors, :status =&amp;gt; :unprocessable_entity }
    end
  end
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;&amp;#x8DDF;Rails 2&amp;#x6709;&amp;#x70B9;&amp;#x4E0D;&amp;#x540C;&amp;#xFF0C;&amp;#x5728;Rails 2&amp;#x91CC;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x8C03;&amp;#x7528;&lt;code&gt;deliver_registration_confirmation&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x3002; &amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;registration_confirmation&amp;#x65B9;&amp;#x6CD5;&amp;#x8FD4;&amp;#x56DE;&amp;#x4E00;&amp;#x4E2A;mail message&amp;#x5BF9;&amp;#x8C61;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x518D;&amp;#x8C03;&amp;#x7528;&amp;#x5B83;&amp;#x7684;deliver&amp;#x65B9;&amp;#x6CD5;&amp;#x3002; &amp;#x8FD9;&amp;#x6837;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x53D1;&amp;#x9001;email&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#x624D;&amp;#x8C03;&amp;#x7528;deliver&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x73B0;&amp;#x5728;&amp;#x6D4B;&amp;#x8BD5;&amp;#x4E00;&amp;#x4E0B;&amp;#xFF1A; &amp;#x6CE8;&amp;#x518C;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x7684;&amp;#x7528;&amp;#x6237;&amp;#xFF0C;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x63D0;&amp;#x4EA4;&amp;#x8868;&amp;#x5355;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x7CFB;&amp;#x7EDF;&amp;#x5C31;&amp;#x4F1A;&amp;#x53D1;&amp;#x9001;&amp;#x4E00;&amp;#x5C01;email.&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/349/original/E206I02.png" width="798" height="340" alt="The registration email send from the application."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x4ECE;&amp;#x4E0A;&amp;#x56FE;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;#x6211;&amp;#x4EEC;&amp;#x90AE;&amp;#x4EF6;&amp;#x53D1;&amp;#x9001;&amp;#x6210;&amp;#x529F;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x60F3;&amp;#x5728;email&amp;#x91CC;&amp;#x9762;&amp;#x663E;&amp;#x793A;&amp;#x521A;&amp;#x6CE8;&amp;#x518C;&amp;#x7684;&amp;#x7528;&amp;#x6237;&amp;#x7684;&amp;#x59D3;&amp;#x540D;&amp;#x8BE5;&amp;#x600E;&amp;#x4E48;&amp;#x529E;&amp;#x5462;&amp;#xFF1F; &amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x628A;user&amp;#x5BF9;&amp;#x8C61;&amp;#x4F20;&amp;#x5230;view&amp;#x91CC;&amp;#x9762;&amp;#x3002; &amp;#x5728;Rails 3&amp;#x91CC;&amp;#x9762;&amp;#x6211;&amp;#x4EEC;&amp;#x5F88;&amp;#x5BB9;&amp;#x6613;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x8FD9;&amp;#x6837;&amp;#x505A;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;mailers&amp;#x5C31;&amp;#x50CF;controllers&amp;#x4E00;&amp;#x6837;&amp;#xFF0C; &amp;#x4EFB;&amp;#x4F55;&amp;#x5B9E;&amp;#x4F8B;&amp;#x53D8;&amp;#x91CF;(instance variables)&amp;#x90FD;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;view&amp;#x91CC;&amp;#x9762;&amp;#x8BBF;&amp;#x95EE;&amp;#x3002; &amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x505A;&amp;#x7684;&amp;#x4EC5;&amp;#x4EC5;&amp;#x662F;&amp;#x7528;&amp;#x4F20;&amp;#x9012;&amp;#x5230;&lt;code&gt;registration_confirmation&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;user&amp;#x53D8;&amp;#x91CF;&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x4E2A;view&amp;#x91CC;&amp;#x53EF;&amp;#x4EE5;&amp;#x8BBF;&amp;#x95EE;&amp;#x7684;&amp;#x5B9E;&amp;#x4F53;&amp;#x53D8;&amp;#x91CF;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/mailers/user_mailer.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
def registration_confirmation(user)
  @user = user
  mail(:to =&amp;gt; user.email, :subject =&amp;gt; &amp;quot;Registered&amp;quot;)
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x56E0;&amp;#x4E3A;&lt;code&gt;mail&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x4F1A;&amp;#x8FD4;&amp;#x56DE;mail message&amp;#xFF0C;mail&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;&amp;#x8C03;&amp;#x7528;&amp;#x5FC5;&amp;#x987B;&amp;#x5199;&amp;#x5728;&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;&amp;#x6700;&amp;#x540E;&amp;#x3002; &amp;#x8FD9;&amp;#x6837;&amp;#x6211;&amp;#x4EEC;&amp;#x5F97;&amp;#x5728;mail&amp;#x65B9;&amp;#x6CD5;&amp;#x524D;&amp;#x5B9A;&amp;#x4E49;&amp;#x5B9E;&amp;#x4F53;&amp;#x53D8;&amp;#x91CF;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;mailer&amp;#x91CC;&amp;#x9762;&amp;#x5B9A;&amp;#x4E49;&amp;#x4E86;&amp;#x5B9E;&amp;#x4F53;&amp;#x53D8;&amp;#x91CF;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;view&amp;#x91CC;&amp;#x9762;&amp;#x4F7F;&amp;#x7528;&amp;#x5B83;&amp;#x628A;&amp;#x7528;&amp;#x6237;&amp;#x7684;&amp;#x59D3;&amp;#x540D;&amp;#x6DFB;&amp;#x52A0;&amp;#x5728;email&amp;#x91CC;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/user_mailer/registration_confirmation.text.erb&lt;/p&gt;
&lt;pre class="erb"&gt;
&amp;lt;%= @user.name %&amp;gt;,

Thank you for registering!
&lt;/pre&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x518D;&amp;#x6B21;&amp;#x6CE8;&amp;#x518C;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x7684;&amp;#x7528;&amp;#x6237;&amp;#xFF0C;&amp;#x7528;&amp;#x6237;&amp;#x7684;&amp;#x59D3;&amp;#x540D;&amp;#x5C06;&amp;#x4F1A;&amp;#x663E;&amp;#x793A;&amp;#x5728;email&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#x91CC;:&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/350/original/E206I03.png" width="797" height="340" alt="The new user&amp;rsquo;s name is now included in the email."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x60F3;&amp;#x8981;&amp;#x5728;email&amp;#x91CC;&amp;#x9762;&amp;#x63D0;&amp;#x4F9B;&amp;#x7ED9;&amp;#x65B0;&amp;#x7528;&amp;#x6237;&amp;#x7F16;&amp;#x8F91;&amp;#x4ED6;&amp;#x4EEC;&amp;#x7684;&amp;#x4E2A;&amp;#x4EBA;&amp;#x4FE1;&amp;#x606F;&amp;#x7684;&amp;#x94FE;&amp;#x63A5;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x8FD9;&amp;#x6837;&amp;#x505A;:&lt;/p&gt;

&lt;pre class="erb"&gt;
Edit Profile: &amp;lt;%= edit_user_url(@user) %&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x6837;&amp;#x662F;&amp;#x65E0;&amp;#x6CD5;&amp;#x5DE5;&amp;#x4F5C;&amp;#x7684;&amp;#x3002; &amp;#x6211;&amp;#x4EEC;&amp;#x5FC5;&amp;#x987B;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;:host&lt;/code&gt;&amp;#x63D0;&amp;#x4F9B;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x57DF;&amp;#x540D;.&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/user_mailer/registration_confirmation.text.erb&lt;/p&gt;
&lt;pre class="erb"&gt;
&amp;lt;%= @user.name %&amp;gt;,

Thank you for registering!

Edit Profile: &amp;lt;%= edit_user_url(@user, :host =&amp;gt; &amp;quot;localhost:3000&amp;quot;) %&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x5FC5;&amp;#x987B;&amp;#x8FD9;&amp;#x6837;&amp;#x505A;&amp;#x7684;&amp;#x539F;&amp;#x56E0;&amp;#x662F;mailers&amp;#x5DF2;&amp;#x7ECF;&amp;#x5B8C;&amp;#x5168;&amp;#x4ECE;&amp;#x5F53;&amp;#x524D;&amp;#x7684;&amp;#x8BF7;&amp;#x6C42;(request)&amp;#x5206;&amp;#x79BB;&amp;#x51FA;&amp;#x6765;&amp;#x3002; &amp;#x8FD9;&amp;#x6837;&amp;#x8BBE;&amp;#x8BA1;&amp;#x7684;&amp;#x539F;&amp;#x56E0;&amp;#x662F;&amp;#xFF1A;mailer&amp;#x53EF;&amp;#x4EE5;&amp;#x4E0D;&amp;#x5728;&amp;#x5F53;&amp;#x524D;controller&amp;#x7684;&amp;#x8BF7;&amp;#x6C42;&amp;#x5185;&amp;#x53D1;&amp;#x9001;email&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;&amp;#x4E4B;&amp;#x524D;&amp;#x7684;initializer&amp;#x6587;&amp;#x4EF6;&amp;#x91CC;&amp;#x8BBE;&amp;#x5B9A;host&amp;#x7684;&amp;#x503C;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x4E0D;&amp;#x9700;&amp;#x8981;&amp;#x5BF9;&amp;#x6BCF;&amp;#x5C01;email&amp;#x7684;&amp;#x6BCF;&amp;#x4E2A;link&amp;#x90FD;&amp;#x8BBE;&amp;#x5B9A;host&amp;#x503C;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/config/initializers/setup_mail.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
ActionMailer::Base.smtp_settings = {
  :address              =&amp;gt; &amp;quot;smtp.gmail.com&amp;quot;,
  :port                 =&amp;gt; 587,
  :domain               =&amp;gt; &amp;quot;asciicasts.com&amp;quot;,
  :user_name            =&amp;gt; &amp;quot;asciicasts&amp;quot;,
  :password             =&amp;gt; &amp;quot;secret&amp;quot;,
  :authentication       =&amp;gt; &amp;quot;plain&amp;quot;,
  :enable_starttls_auto =&amp;gt; true
}

ActionMailer::Base.default_url_options[:host] = &amp;quot;localhost:3000&amp;quot;
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x8FD9;&amp;#x91CC;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;hash&amp;#x6307;&amp;#x5B9A;&amp;#x4EFB;&amp;#x4F55;&amp;#x8BBE;&amp;#x7F6E;(options)&amp;#xFF0C;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x53EA;&amp;#x9700;&amp;#x8981;&amp;#x8BBE;&amp;#x5B9A;host&amp;#x503C;&amp;#x3002;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x518D;&amp;#x6B21;&amp;#x6CE8;&amp;#x518C;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;email&amp;#x91CC;&amp;#x9762;&amp;#x770B;&amp;#x5230;&amp;#x4E00;&amp;#x4E2A;&amp;#x5E26;&amp;#x6709;&amp;#x6B63;&amp;#x786E;url&amp;#x7684;&amp;#x94FE;&amp;#x63A5;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/351/original/E206I04.png" width="797" height="340" alt="The registration email now has a link to the user's profile."/&gt;
&lt;/div&gt;

&lt;h3&gt;Multipart&amp;#x90AE;&amp;#x4EF6;&amp;#x4E0E;&amp;#x9644;&amp;#x4EF6;&lt;/h3&gt;

&lt;p&gt;&amp;#x5728;Rails 3&amp;#x91CC;&amp;#x9762;&amp;#x53D1;&amp;#x9001;multipart emails&amp;#x4E5F;&amp;#x76F8;&amp;#x5F53;&amp;#x65B9;&amp;#x4FBF;&amp;#x3002; &amp;#x6211;&amp;#x4EEC;&amp;#x6240;&amp;#x9700;&amp;#x8981;&amp;#x505A;&amp;#x7684;&amp;#x4EC5;&amp;#x4EC5;&amp;#x662F;&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x4E2A;&amp;#x8DDF;text view&amp;#x540C;&amp;#x540D;&amp;#x7684;&amp;#x89C6;&amp;#x56FE;&amp;#x6587;&amp;#x4EF6;(view)&amp;#x3002; &amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x4F8B;&amp;#x5B50;&amp;#x91CC;&amp;#x9762;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x4E3A;&lt;code&gt;registration_confirmation.html.erb&lt;/code&gt;&amp;#x3002; &amp;#x5728;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x91CC;&amp;#x9762;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E9B;&amp;#x7B80;&amp;#x5355;&amp;#x7684;html&amp;#x4EE3;&amp;#x7801;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/user_mailer/registration_confirmation.html.erb&lt;/p&gt;
&lt;pre class="erb"&gt;
&amp;lt;p&amp;gt;&amp;lt;%= @user.name %&amp;gt;,&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;Thank you for registering!&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;&amp;lt;%= link_to &amp;quot;Edit Profile&amp;quot;, edit_user_url(@user, :host =&amp;gt; &amp;quot;localhost:3000&amp;quot;) %&amp;gt;&amp;lt;/p&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x652F;&amp;#x6301;html&amp;#x7684;&amp;#x5BA2;&amp;#x6237;&amp;#x7AEF;&amp;#x67E5;&amp;#x770B;email&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;email&amp;#x91CC;&amp;#x9762;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x94FE;&amp;#x63A5;&amp;#x3002;&amp;#x4E24;&amp;#x79CD;&amp;#x7C7B;&amp;#x578B;&amp;#x7684;email&amp;#x5185;&amp;#x5BB9;&amp;#x90FD;&amp;#x4F1A;&amp;#x53D1;&amp;#x9001;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x5982;&amp;#x679C;&amp;#x5BA2;&amp;#x6237;&amp;#x7AEF;&amp;#x4E0D;&amp;#x652F;&amp;#x6301;html&amp;#xFF0C;&amp;#x5B83;&amp;#x5C06;&amp;#x4F1A;&amp;#x663E;&amp;#x793A;&amp;#x7EAF;&amp;#x6587;&amp;#x672C;&amp;#x5F62;&amp;#x5F0F;&amp;#x7684;email&amp;#x5185;&amp;#x5BB9;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/352/original/E206I05.png" width="797" height="340" alt="The email is displayed as HTML."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x6DFB;&amp;#x52A0;&amp;#x9644;&amp;#x4EF6;&amp;#x64CD;&amp;#x4F5C;&amp;#x76F8;&amp;#x5F53;&amp;#x76F4;&amp;#x63A5;&amp;#x800C;&amp;#x7B80;&amp;#x5355;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x53EA;&amp;#x7528;&amp;#x8C03;&amp;#x7528;attachements&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x8BBE;&amp;#x7F6E;&amp;#x9644;&amp;#x4EF6;&amp;#x540D;&amp;#x79F0;&amp;#xFF0C;&amp;#x5E76;&amp;#x8BFB;&amp;#x53D6;&amp;#x4E00;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x7ED9;&amp;#x8FD9;&amp;#x4E2A;&amp;#x9644;&amp;#x4EF6;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/mailers/user_mailer.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
def registration_confirmation(user)
  @user = user
  attachments[&amp;quot;rails.png&amp;quot;] = File.read(&amp;quot;#{Rails.root}/public/images/rails.png&amp;quot;)
  mail(:to =&amp;gt; &amp;quot;#{user.name} &amp;lt;#{user.email}&amp;gt;&amp;quot;, :subject =&amp;gt; &amp;quot;Registered&amp;quot;)
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x518D;&amp;#x6B21;&amp;#x6CE8;&amp;#x518C;&amp;#xFF0C;&lt;code&gt;rails.png&lt;/code&gt;&amp;#x6587;&amp;#x4EF6;&amp;#x5C31;&amp;#x4F5C;&amp;#x4E3A;&amp;#x4E00;&amp;#x4E2A;&amp;#x9644;&amp;#x4EF6;&amp;#x663E;&amp;#x793A;&amp;#x5728;email&amp;#x91CC;&amp;#x9762;&amp;#x3002; &amp;#x6CE8;&amp;#x610F;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x628A;&amp;#x7528;&amp;#x6237;&amp;#x7684;&amp;#x59D3;&amp;#x540D;&amp;#x6DFB;&amp;#x52A0;&amp;#x5230;&lt;code&gt;:to&lt;/code&gt;&amp;#x91CC;&amp;#x9762;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/353/original/E206I06.png" width="765" height="340" alt="Adding an attachment."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x51FA;&amp;#x4F7F;&amp;#x7528;&amp;#x65B0;&amp;#x7684;ActionMailer API,&amp;#x6211;&amp;#x4EEC;&amp;#x5F88;&amp;#x5BB9;&amp;#x6613;&amp;#x5C31;&amp;#x521B;&amp;#x5EFA;&amp;#x590D;&amp;#x6742;&amp;#x7684;emails. &amp;#x9ED8;&amp;#x8BA4;&amp;#x7684;&amp;#x8BBE;&amp;#x7F6E;&amp;#x57FA;&amp;#x672C;&amp;#x4E0A;&amp;#x591F;&amp;#x7528;&amp;#x4E86;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x60F3;&amp;#x8BBE;&amp;#x7F6E;&amp;#x7C7B;&amp;#x4F3C;&amp;#x7F16;&amp;#x7801;&amp;#x683C;&amp;#x5F0F;(encoding types)&amp;#x7684;&amp;#x503C;&amp;#xFF0C;&amp;#x4F60;&amp;#x53EF;&amp;#x4EE5;&amp;#x4FEE;&amp;#x6539;&amp;#x8986;&amp;#x76D6;&amp;#x9ED8;&amp;#x8BA4;&amp;#x8BBE;&amp;#x7F6E;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;&amp;#x62E6;&amp;#x622A;&amp;#x5668;(Interceptors)&lt;/h3&gt;

&lt;p&gt;&amp;#x518D;&amp;#x7ED3;&amp;#x675F;&amp;#x672C;&amp;#x7AE0;&amp;#x4E4B;&amp;#x524D;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x4F1A;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E00;&amp;#x5411;&amp;#x65B0;&amp;#x6280;&amp;#x672F;&amp;#xFF1A;&amp;#x5728;email messages&amp;#x53D1;&amp;#x9001;&amp;#x524D;&amp;#x62E6;&amp;#x622A;&amp;#x5B83;&amp;#x4EEC;&amp;#x3002; &amp;#x62E6;&amp;#x622A;&amp;#x5668;&amp;#x53EF;&amp;#x4EE5;&amp;#x5E2E;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x5F00;&amp;#x53D1;&amp;#x6A21;&amp;#x5F0F;&amp;#x7684;&amp;#x65F6;&amp;#x5019;(development mode)&amp;#x6539;&amp;#x53D8;email&amp;#x7684;&amp;#x53D1;&amp;#x9001;&amp;#x65B9;&amp;#x5F0F;&amp;#xFF0C; &amp;#x8FD9;&amp;#x6837;emails&amp;#x5C06;&amp;#x4F1A;&amp;#x53EA;&amp;#x53D1;&amp;#x9001;&amp;#x5230;&amp;#x4F60;&amp;#x81EA;&amp;#x5DF1;&amp;#x7684;&amp;#x5E10;&amp;#x53F7;&amp;#x91CC;&amp;#x800C;&amp;#x4E0D;&amp;#x4F1A;&amp;#x53D1;&amp;#x9001;&amp;#x5230;&amp;#x4EFB;&amp;#x4F55;&amp;#x4F60;&amp;#x521B;&amp;#x5EFA;&amp;#x7684;&amp;#x7528;&amp;#x6237;&amp;#x7684;email&amp;#x5E10;&amp;#x53F7;&amp;#x91CC;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;&amp;#x529F;&amp;#x80FD;&amp;#x521A;&amp;#x521A;&amp;#x88AB;&amp;#x52A0;&amp;#x5728;&amp;#x65B0;&amp;#x7684;Mail gem&amp;#x91CC;&amp;#xFF0C; &amp;#x56E0;&amp;#x6B64;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x5347;&amp;#x7EA7;mail&amp;#x5230;&amp;#x6700;&amp;#x65B0;&amp;#x7248;&amp;#x672C;(&amp;#x81F3;&amp;#x5C11;2.1.3)&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x901A;&amp;#x8FC7;&amp;#x4FEE;&amp;#x6539;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x7684;Gemfile&amp;#x6587;&amp;#x4EF6;&amp;#x53BB;&amp;#x83B7;&amp;#x5F97;&amp;#x6B63;&amp;#x786E;&amp;#x7684;&amp;#x7248;&amp;#x672C;:&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/Gemfile&lt;/p&gt;
&lt;pre class="ruby"&gt;
gem &amp;quot;mail&amp;quot;, &amp;quot;2.1.3&amp;quot;
&lt;/pre&gt;

&lt;p&gt;&amp;#x7136;&amp;#x540E;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD0;&amp;#x884C;&lt;code&gt;bundle install&lt;/code&gt;&amp;#x53BB;&amp;#x5B89;&amp;#x88C5;&amp;#x5347;&amp;#x7EA7;&amp;#x7684;&amp;#x7248;&amp;#x672C;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x63A5;&amp;#x4E0B;&amp;#x6765;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x521B;&amp;#x5EFA;&amp;#x62E6;&amp;#x622A;&amp;#x5668;(interceptor)&amp;#x7C7B;&amp;#x3002; &amp;#x6211;&amp;#x4EEC;&amp;#x628A;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x547D;&amp;#x540D;&amp;#x4E3A;&lt;code&gt;development_mail_interceptor.rb&lt;/code&gt;&amp;#x5E76;&amp;#x628A;&amp;#x5B83;&amp;#x653E;&amp;#x5728;&lt;code&gt;/lib&lt;/code&gt;&amp;#x76EE;&amp;#x5F55;&amp;#x4E0B;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/lib/development_mail_interceptor.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
class DevelopmentMailInterceptor
  def self.delivering_email(message)
    message.subject = &amp;quot;[#{message.to}] #{message.subject}&amp;quot;
    message.to = &amp;quot;eifion@asciicasts.com&amp;quot;
  end
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x7C7B;&amp;#x65B9;&amp;#x6CD5;&lt;code&gt;delivering_email&lt;/code&gt;&amp;#x83B7;&amp;#x5F97;&amp;#x51C6;&amp;#x5907;&amp;#x53D1;&amp;#x9001;&amp;#x7684;email message&amp;#xFF0C; &amp;#x4FEE;&amp;#x6539;&amp;#x5B83;&amp;#x7684;&amp;#x4E3B;&amp;#x9898;(subject)&amp;#x4E3A;&amp;#x539F;&amp;#x76EE;&amp;#x6807;&amp;#x5730;&amp;#x5740;(message.to) &amp;#x52A0;&amp;#x4E0A;&amp;#x539F;&amp;#x4E3B;&amp;#x9898;(message.subject)&amp;#x3002;message&amp;#x7684;to&amp;#x5B57;&amp;#x6BB5;&amp;#x4E5F;&amp;#x88AB;&amp;#x4FEE;&amp;#x6539;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x6240;&amp;#x6709;&amp;#x7684;email&amp;#x5C06;&amp;#x4F1A;&amp;#x53D1;&amp;#x5230;&lt;code&gt;eifion@asciicasts.com&lt;/code&gt;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x628A;&amp;#x8FD9;&amp;#x4E2A;&amp;#x62E6;&amp;#x622A;&amp;#x5668;(interceptor)&amp;#x6CE8;&amp;#x518C;&amp;#x5230;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x521D;&amp;#x59CB;&amp;#x5316;&amp;#x6587;&amp;#x4EF6;(initializer)&amp;#x5185;:&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/config/initializers/setup_mail.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
Mail.register_interceptor(DevelopmentMailInterceptor) if Rails.env.development?
&lt;/pre&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x8FD0;&amp;#x884C;&amp;#x5728;&amp;#x5F00;&amp;#x53D1;&amp;#x6A21;&amp;#x5F0F;(development mode)&amp;#x4E0B;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x62E6;&amp;#x622A;&amp;#x5668;(interceptor)&amp;#x7684;&lt;code&gt;delivering_email&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x5C06;&amp;#x4F1A;&amp;#x88AB;&amp;#x8C03;&amp;#x7528;&amp;#x3002; &amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;Rails 3.0 &amp;#x5305;&amp;#x542B;&amp;#x5347;&amp;#x7EA7;&amp;#x4E86;&amp;#x7684;Mail gem, &amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x628A;&amp;#x65B9;&amp;#x6CD5;&amp;#x8C03;&amp;#x7528;&lt;code&gt;Mail.register_interceptor&lt;/code&gt;&amp;#x66FF;&amp;#x6362;&amp;#x4E3A;&lt;code&gt;ActionMailer::Base.register_interceptor&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x6CE8;&amp;#x518C;&amp;#x65B0;&amp;#x7528;&amp;#x6237;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x6CE8;&amp;#x518C;&amp;#x786E;&amp;#x8BA4;email&amp;#x5C06;&amp;#x6C38;&amp;#x8FDC;&amp;#x53D1;&amp;#x7ED9;&lt;code&gt;eifion@asciicasts.com&lt;/code&gt;&amp;#x3002; &amp;#x539F;&amp;#x59CB;&amp;#x7684;&amp;#x6536;&amp;#x4EF6;&amp;#x4EBA;(recipient)&amp;#x5730;&amp;#x5740;&amp;#x663E;&amp;#x793A;&amp;#x5728;&amp;#x4E3B;&amp;#x9898;&amp;#x680F;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/354/original/E206I07.png" width="765" height="340" alt="In development mode the email is now sent to us rather than the intended user."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x4F60;&amp;#x5F00;&amp;#x53D1;&amp;#x4F60;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x8FD9;&amp;#x662F;&amp;#x4E2A;&amp;#x68C0;&amp;#x67E5;&amp;#x4F60;&amp;#x7684;emails&amp;#x662F;&amp;#x5426;&amp;#x5DE5;&amp;#x4F5C;&amp;#x7684;&amp;#x597D;&amp;#x529E;&amp;#x6CD5;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x4EE5;&amp;#x4E0A;&amp;#x5C31;&amp;#x662F;&amp;#x8FD9;&amp;#x7AE0;&amp;#x7684;&amp;#x5168;&amp;#x90E8;&amp;#x4E86;&amp;#x3002; &amp;#x6211;&amp;#x5E0C;&amp;#x671B;&amp;#x8FD9;&amp;#x7AE0;&amp;#x5BF9;&amp;#x4F60;&amp;#x6709;&amp;#x7528;&amp;#x3002;&amp;#x65B0;&amp;#x7684;ActionMailer API &amp;#x8BA9; Rails &amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x53D1;&amp;#x9001;email&amp;#x66F4;&amp;#x52A0;&amp;#x65B9;&amp;#x4FBF;&amp;#x3002;&lt;/p&gt;</description>
      <pubDate>Fri, 02 Apr 2010 21:53:59 +0000</pubDate>
      <guid>http://cn.asciicasts.com/episodes/206-actionmailer-in-rails3</guid>
      <link>http://cn.asciicasts.com/episodes/206-actionmailer-in-rails3</link>
    </item>
    <item>
      <title>Unobtrusive JavaScript</title>
      <description>&lt;p&gt;&amp;#x8BD1;&amp;#x8005;&amp;#x524D;&amp;#x8A00;&amp;#xFF1A;
Unobtrusive JavaScript&amp;#x8FD9;&amp;#x4E2A;&amp;#x8BCD;&amp;#x5728;&amp;#x56FD;&amp;#x5185;&amp;#x53EB;&amp;#x6CD5;&amp;#x4E0D;&amp;#x4E00;&amp;#xFF0C;&amp;#x6211;&amp;#x4E5F;&amp;#x4E0D;&amp;#x77E5;&amp;#x9053;&amp;#x5982;&amp;#x4F55;&amp;#x7FFB;&amp;#x8BD1;&amp;#x6BD4;&amp;#x8F83;&amp;#x8D34;&amp;#x5207;&amp;#xFF0C;&amp;#x7D22;&amp;#x6027;&amp;#x5C31;&amp;#x76F4;&amp;#x63A5;&amp;#x91C7;&amp;#x7528;&amp;#x82F1;&amp;#x6587;&amp;#x4E86;&amp;#x3002;&amp;#x4E00;&amp;#x6765;&amp;#x907F;&amp;#x514D;&amp;#x9020;&amp;#x6210;&amp;#x8BEF;&amp;#x89E3;&amp;#xFF0C;&amp;#x4E8C;&amp;#x6765;&amp;#x5728;&amp;#x5927;&amp;#x5BB6;Google&amp;#x6216;Wikipedia&amp;#x4E2D;&amp;#x4E5F;&amp;#x597D;&amp;#x67E5;&amp;#x3002; Unobtrusive JavaScript&amp;#x5E76;&amp;#x4E0D;&amp;#x662F;Rails&amp;#x7684;&amp;#x6982;&amp;#x5FF5;&amp;#xFF0C;&amp;#x5B83;&amp;#x53EA;&amp;#x662F;&amp;#x5408;&amp;#x7406;&amp;#x7EC4;&amp;#x7EC7;JavaScript&amp;#x4EE3;&amp;#x7801;&amp;#x7684;&amp;#x4E00;&amp;#x79CD;&amp;#x65B9;&amp;#x5F0F;&amp;#x3002;Rails 3&amp;#x53EA;&amp;#x662F;&amp;#x4F7F;&amp;#x7528;&amp;#x8FD9;&amp;#x4E2A;&amp;#x65B9;&amp;#x5F0F;&amp;#x4F18;&amp;#x5316;&amp;#x81EA;&amp;#x5DF1;&amp;#x751F;&amp;#x6210;&amp;#x7684;&amp;#x5BA2;&amp;#x6237;&amp;#x7AEF;&amp;#x4EE3;&amp;#x7801;&amp;#x800C;&amp;#x5DF2;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x4E00;&amp;#x96C6;&amp;#x4E2D;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x770B;&amp;#x770B;&amp;#x4E00;&amp;#x4E2A;Rails 3&amp;#x7684;&amp;#x65B0;&amp;#x7279;&amp;#x6027;&amp;#xFF1A;&amp;#x5982;&amp;#x4F55;&amp;#x4F7F;&amp;#x7528;Unobtrusive JavaScript&amp;#x3002;Unobtrusive JavaScript&amp;#x662F;&amp;#x4E00;&amp;#x79CD;&amp;#x5C06;web&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x7684;&amp;#x884C;&amp;#x4E3A;&amp;#x548C;&amp;#x5185;&amp;#x5BB9;&amp;#xFF08;&amp;#x6216;&amp;#x7ED3;&amp;#x6784;&amp;#xFF09;&amp;#x5206;&amp;#x79BB;&amp;#x7684;&amp;#x6280;&amp;#x672F;&amp;#x3002;&amp;#x5C31;&amp;#x50CF;CSS&amp;#x8BA9;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5206;&amp;#x79BB;&amp;#x8868;&amp;#x73B0;&amp;#x548C;&amp;#x5185;&amp;#x5BB9;&amp;#x4E00;&amp;#x6837;&amp;#x3002;&amp;#x8FD9;&amp;#x6B21;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x8981;&amp;#x8BB2;&amp;#x8FF0;Rails 3&amp;#x662F;&amp;#x5982;&amp;#x4F55;&amp;#x5229;&amp;#x7528;Unobtrusive JavaScript&amp;#x7684;&amp;#xFF0C;&amp;#x4F46;&amp;#x5728;&amp;#x6B64;&amp;#x4E4B;&amp;#x524D;&amp;#xFF0C;&amp;#x5148;&amp;#x770B;&amp;#x4E00;&amp;#x4E2A;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x4F8B;&amp;#x5B50;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x4E0B;&amp;#x56FE;&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;&amp;#x7F51;&amp;#x9875;&amp;#xFF0C;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x70B9;&amp;#x51FB; Click Here &amp;#x94FE;&amp;#x63A5;&amp;#x65F6;&amp;#xFF0C;&amp;#x4F1A;&amp;#x7528;JavaScript&amp;#x5F39;&amp;#x51FA;&amp;#x4E00;&amp;#x4E2A;&amp;#x63D0;&amp;#x793A;&amp;#x6846;&amp;#x663E;&amp;#x793A;&amp;quot;Hello World!&amp;quot;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/343/original/E205I01.png" width="639" height="337" alt="The alert shown by the inline JavaScript."/&gt;
&lt;/div&gt;


&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;&amp;#x9875;&amp;#x9762;&amp;#x7684;HTML&amp;#x5927;&amp;#x6982;&amp;#x662F;&amp;#x8FD9;&amp;#x6837;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;lt;!DOCTYPE html&amp;gt;  
&amp;lt;html&amp;gt;  
  &amp;lt;head&amp;gt;  
    &amp;lt;title&amp;gt;UJS Example&amp;lt;/title&amp;gt;  
  &amp;lt;/head&amp;gt;  
  &amp;lt;body&amp;gt;  
    &amp;lt;h1&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; onclick=&amp;quot;alert(&amp;#x27;Hello world!&amp;#x27;); return false;&amp;quot;&amp;gt;Click Here&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;  
  &amp;lt;/body&amp;gt;  
&amp;lt;/html&amp;gt;&lt;/pre&gt;

&lt;p&gt;&amp;#x5728;&amp;#x8FD9;&amp;#x4E2A;&amp;#x9875;&amp;#x9762;&amp;#x4E2D;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x94FE;&amp;#x63A5;&amp;#xFF0C;&amp;#x5B83;&amp;#x7684;onclick&amp;#x5C5E;&amp;#x6027;&amp;#x4E2D;&amp;#x542B;&amp;#x6709;&amp;#x4E00;&amp;#x4E9B;JavaScript&amp;#x4EE3;&amp;#x7801;&amp;#x3002;&amp;#x628A;JavaScript&amp;#x5185;&amp;#x8054;&amp;#x5728;HTML&amp;#x6807;&amp;#x7B7E;&amp;#x4E2D;&amp;#x662F;&amp;#x4E00;&amp;#x4EF6;&amp;#x5F88;&amp;#x574F;&amp;#x7684;&amp;#x4E8B;&amp;#x60C5;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x628A;&amp;#x7ED3;&amp;#x6784;&amp;#x548C;&amp;#x884C;&amp;#x4E3A;&amp;#x6DF7;&amp;#x5408;&amp;#x5728;&amp;#x4E00;&amp;#x8D77;&amp;#x4E86;&amp;#x3002;&amp;#x56DE;&amp;#x987E;1990&amp;#x5E74;&amp;#xFF0C;&amp;#x90A3;&amp;#x65F6;&amp;#x6211;&amp;#x4EEC;&amp;#x7ECF;&amp;#x5E38;&amp;#x7528;font&amp;#x6807;&amp;#x7B7E;&amp;#x8BBE;&amp;#x7F6E;&amp;#x6587;&amp;#x672C;&amp;#x7684;&amp;#x5B57;&amp;#x4F53;&amp;#x3001;&amp;#x5B57;&amp;#x53F7;&amp;#x548C;&amp;#x989C;&amp;#x8272;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#x5F53;&amp;#x65F6;&amp;#x8FD8;&amp;#x6CA1;&amp;#x6709;CSS&amp;#x3002;&amp;#x8FD9;&amp;#x610F;&amp;#x5473;&amp;#x7740;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x6539;&amp;#x53D8;&amp;#x7F51;&amp;#x7AD9;&amp;#x7684;&amp;#x6240;&amp;#x6709;&amp;#x6587;&amp;#x5B57;&amp;#x7684;&amp;#x5B57;&amp;#x4F53;&amp;#xFF0C;&amp;#x53EF;&amp;#x80FD;&amp;#x5C31;&amp;#x8981;&amp;#x6539;&amp;#x52A8;&amp;#x4E0A;&amp;#x6570;&amp;#x4EE5;&amp;#x767E;&amp;#x8BA1;&amp;#x7684;&amp;#x5730;&amp;#x65B9;&amp;#x3002;&amp;#x76F4;&amp;#x5230;CSS&amp;#x51FA;&amp;#x73B0;&amp;#x540E;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x628A;&amp;#x6837;&amp;#x5F0F;&amp;#x63D0;&amp;#x53D6;&amp;#x51FA;&amp;#x6765;&amp;#xFF0C;&amp;#x653E;&amp;#x5230;&amp;#x6837;&amp;#x5F0F;&amp;#x8868;&amp;#x4E2D;&amp;#x53BB;&amp;#x3002;&amp;#x8FD9;&amp;#x4F7F;&amp;#x7F51;&amp;#x7AD9;&amp;#x66F4;&amp;#x52A0;&amp;#x6613;&amp;#x4E8E;&amp;#x7EF4;&amp;#x62A4;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x540C;&amp;#x6837;&amp;#x7684;&amp;#x9053;&amp;#x7406;&amp;#x4E5F;&amp;#x9002;&amp;#x7528;&amp;#x4E8E;JavaScript&amp;#x3002;&amp;#x628A;&amp;#x5C0F;&amp;#x6BB5;&amp;#x7684;JavaScript&amp;#x4EE3;&amp;#x7801;&amp;#x653E;&amp;#x5230;HTML&amp;#x6807;&amp;#x7B7E;&amp;#x7684;&amp;#x5C5E;&amp;#x6027;&amp;#x4E2D;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x505A;&amp;#x6DF7;&amp;#x6DC6;&amp;#x4E86;&amp;#x7126;&amp;#x70B9;&amp;#x5E76;&amp;#x4F7F;&amp;#x7F51;&amp;#x7AD9;&amp;#x96BE;&amp;#x4EE5;&amp;#x66F4;&amp;#x65B0;&amp;#x3002;&amp;#x5C06;JavaScript&amp;#x653E;&amp;#x5230;&amp;#x5355;&amp;#x72EC;&amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#xFF0C;&amp;#x964D;&amp;#x4F4E;&amp;#x4E86;&amp;#x4EE3;&amp;#x7801;&amp;#x91CD;&amp;#x590D;&amp;#xFF0C;&amp;#x4FBF;&amp;#x4E8E;&amp;#x91CD;&amp;#x6784;&amp;#xFF0C;&amp;#x800C;&amp;#x4E14;&amp;#x6709;&amp;#x5229;&amp;#x4E8E;&amp;#x7F16;&amp;#x5199;&amp;#x548C;&amp;#x8C03;&amp;#x8BD5;&amp;#x590D;&amp;#x6742;&amp;#x7684;web&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x90A3;&amp;#x4E48;&amp;#x600E;&amp;#x4E48;&amp;#x8BA9;&amp;#x8FD9;&amp;#x4E2A;&amp;#x7B80;&amp;#x5355;&amp;#x4F8B;&amp;#x5B50;&amp;#x4E2D;&amp;#x7684;JavaScript&amp;#x4E0D;&amp;#x518D;&amp;#x607C;&amp;#x4EBA;&amp;#x5462;&amp;#xFF1F;&amp;#x4E00;&amp;#x4E2A;&amp;#x4E3B;&amp;#x8981;&amp;#x6539;&amp;#x52A8;&amp;#x5C31;&amp;#x662F;&amp;#x5C06;&amp;#x5185;&amp;#x8054;&amp;#x7684;JavaScript&amp;#x653E;&amp;#x5230;&amp;#x5355;&amp;#x72EC;&amp;#x7684;&amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x7528;&amp;#x4E00;&amp;#x4E2A;JavaScript&amp;#x6846;&amp;#x67B6;&amp;#xFF08;&amp;#x8FD9;&amp;#x91CC;&amp;#x7528;jQuery&amp;#xFF09;&amp;#xFF0C;&amp;#x5C06;&amp;#x811A;&amp;#x672C;&amp;#x6302;&amp;#x5230;&amp;#x5143;&amp;#x7D20;&amp;#x7684;&amp;#x4E8B;&amp;#x4EF6;&amp;#x4E0A;&amp;#x3002;&amp;#x4E0B;&amp;#x9762;&amp;#x5C31;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x6539;&amp;#x52A8;&amp;#x540E;&amp;#x7684;&amp;#x9875;&amp;#x9762;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;lt;!DOCTYPE html&amp;gt;  
&amp;lt;html&amp;gt;  
  &amp;lt;head&amp;gt;  
    &amp;lt;title&amp;gt;UJS Example&amp;lt;/title&amp;gt;  
    &amp;lt;script src=&amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&amp;quot; type=&amp;quot;text/javascript&amp;quot; charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;charset=&amp;quot;UTF-8&amp;quot;&amp;gt;  
      $(function () {  
        $(&amp;#x27;#alert&amp;#x27;).click(function () {  
          alert(&amp;#x27;Hello, world!&amp;#x27;);  
          return false;  
        })  
      });  
    &amp;lt;/script&amp;gt;  
  &amp;lt;/head&amp;gt;  
  &amp;lt;body&amp;gt;  
    &amp;lt;h1&amp;gt;&amp;lt;a href=&amp;quot;#&amp;quot; id=&amp;quot;alert&amp;quot;&amp;gt;Click Here&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;  
  &amp;lt;/body&amp;gt;  
&amp;lt;/html&amp;gt;  
&lt;/pre&gt;

&lt;p&gt;&amp;#x9996;&amp;#x5148;&amp;#x8981;&amp;#x58F0;&amp;#x660E;&amp;#x7684;&amp;#x662F;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5E76;&amp;#x6CA1;&amp;#x6709;&amp;#x628A;JavaScript&amp;#x653E;&amp;#x5230;&amp;#x5355;&amp;#x72EC;&amp;#x7684;&amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#xFF0C;&amp;#x8FD9;&amp;#x53EA;&amp;#x662F;&amp;#x4E3A;&amp;#x4E86;&amp;#x66F4;&amp;#x597D;&amp;#x5730;&amp;#x5C55;&amp;#x793A;&amp;#x4EE3;&amp;#x7801;&amp;#x7684;&amp;#x6539;&amp;#x52A8;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5BF9;&amp;#x4E8E;body&amp;#x90E8;&amp;#x5206;&amp;#x7684;&amp;#x94FE;&amp;#x63A5;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x79FB;&amp;#x9664;&amp;#x4E86; &lt;strong&gt;onclick&lt;/strong&gt;
 &amp;#x5C5E;&amp;#x6027;&amp;#x5E76;&amp;#x52A0;&amp;#x4E0A;&amp;#x4E86; &lt;strong&gt;id&lt;/strong&gt;
&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;jQuery&amp;#x53BB;&amp;#x627E;&amp;#x5230;&amp;#x8BE5;&amp;#x94FE;&amp;#x63A5;&amp;#x3002;&amp;#x5728;head&amp;#x90E8;&amp;#x5206;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x52A0;&amp;#x4E0A;&amp;#x4E86;jQuery&amp;#x5E93;&amp;#x7684;&amp;#x5F15;&amp;#x7528;&amp;#xFF0C;&amp;#x4E0B;&amp;#x9762;&amp;#x662F;&amp;#x4E00;&amp;#x6BB5;JavaScript&amp;#x4EE3;&amp;#x7801;&amp;#xFF08;&amp;#x8FD9;&amp;#x6BB5;&amp;#x4EE3;&amp;#x7801;&amp;#x672C;&amp;#x5E94;&amp;#x653E;&amp;#x5230;&amp;#x5355;&amp;#x72EC;&amp;#x7684;&amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#xFF09;&amp;#x3002;&amp;#x5728;&amp;#x8FD9;&amp;#x6BB5;&amp;#x4EE3;&amp;#x7801;&amp;#x7684;&amp;#x5F00;&amp;#x59CB;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x8C03;&amp;#x7528;&amp;#x4E86;jQuery&amp;#x7684; &lt;strong&gt;$&lt;/strong&gt;
 &amp;#x65B9;&amp;#x6CD5;&amp;#x5E76;&amp;#x4EE5;&amp;#x4E00;&amp;#x4E2A;&amp;#x51FD;&amp;#x6570;&amp;#x4F5C;&amp;#x4E3A;&amp;#x53C2;&amp;#x6570;&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&amp;#x51FD;&amp;#x6570;&amp;#x4F1A;&amp;#x5728;&amp;#x9875;&amp;#x9762;&amp;#x7684;DOM&amp;#x52A0;&amp;#x8F7D;&amp;#x65F6;&amp;#x8C03;&amp;#x7528;&amp;#x3002;&amp;#x5728;&amp;#x8FD9;&amp;#x4E2A;&amp;#x51FD;&amp;#x6570;&amp;#x4E2D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x7528;jQuery&amp;#x7684;id&amp;#x9009;&amp;#x62E9;&amp;#x5668;&amp;#x627E;&amp;#x5230;&amp;#x94FE;&amp;#x63A5;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x7ED9;&amp;#x5B83;&amp;#x7684;onclick&amp;#x4E8B;&amp;#x4EF6;&amp;#x7ED1;&amp;#x5B9A;&amp;#x4E00;&amp;#x4E2A;&amp;#x51FD;&amp;#x6570;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E2A;&amp;#x51FD;&amp;#x6570;&amp;#x7528;alert&amp;#x5F39;&amp;#x51FA;&amp;quot;Hello World!&amp;quot;&amp;#x63D0;&amp;#x793A;&amp;#x6846;&amp;#xFF0C;&amp;#x6700;&amp;#x540E;&amp;#x8FD4;&amp;#x56DE;false&amp;#x6765;&amp;#x907F;&amp;#x514D;&amp;#x89E6;&amp;#x53D1;&amp;#x8BE5;&amp;#x94FE;&amp;#x63A5;&amp;#x9ED8;&amp;#x8BA4;&amp;#x7684;&amp;#x884C;&amp;#x4E3A;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#x540E;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x770B;&amp;#x5230;&amp;#x8FD9;&amp;#x4E2A;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#x548C;&amp;#x539F;&amp;#x6765;&amp;#x6709;&amp;#x7740;&amp;#x4E00;&amp;#x6837;&amp;#x7684;&amp;#x6548;&amp;#x679C;&amp;#xFF08;&amp;#x70B9;&amp;#x51FB;&amp;#x94FE;&amp;#x63A5;&amp;#xFF0C;&amp;#x5F39;&amp;#x51FA;&amp;quot;Hello World!&amp;quot;&amp;#xFF09;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x770B;&amp;#x8D77;&amp;#x6765;&amp;#x6211;&amp;#x4EEC;&amp;#x505A;&amp;#x4E86;&amp;#x66F4;&amp;#x591A;&amp;#x5DE5;&amp;#x4F5C;&amp;#xFF0C;&amp;#x5374;&amp;#x6CA1;&amp;#x6709;&amp;#x4EC0;&amp;#x4E48;&amp;#x660E;&amp;#x663E;&amp;#x6548;&amp;#x679C;&amp;#x3002;&amp;#x4F46;&amp;#x8FD9;&amp;#x4E2A;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x4F8B;&amp;#x5B50;&amp;#x5E76;&amp;#x6CA1;&amp;#x6709;&amp;#x5145;&amp;#x5206;&amp;#x5C55;&amp;#x793A;&amp;#x51FA;Unobtrusive JavaScript&amp;#x7684;&amp;#x4F18;&amp;#x52BF;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#x8FD9;&amp;#x4E2A;&amp;#x9875;&amp;#x9762;&amp;#x53EA;&amp;#x6709;&amp;#x4E00;&amp;#x5904;&amp;#x5185;&amp;#x8054;&amp;#x7684;JavaScript&amp;#x3002;&amp;#x800C;&amp;#x4E14;&amp;#x8FD9;&amp;#x4E2A;&amp;#x4F8B;&amp;#x5B50;&amp;#x4E0D;&amp;#x662F;&amp;#x4E3A;&amp;#x4E86;&amp;#x68C0;&amp;#x9A8C;Unobtrusive JavaScript&amp;#x7684;&amp;#x4F18;&amp;#x70B9;&amp;#xFF0C;&amp;#x53EA;&amp;#x662F;&amp;#x6F14;&amp;#x793A;&amp;#x6574;&amp;#x4E2A;&amp;#x8FC7;&amp;#x7A0B;&amp;#x662F;&amp;#x5982;&amp;#x4F55;&amp;#x5B8C;&amp;#x6210;&amp;#xFF0C;&amp;#x548C;&amp;#x5982;&amp;#x4F55;&amp;#x6BD4;&amp;#x8F83;&amp;#x7684;&amp;#x3002;&amp;#x53EA;&amp;#x6709;&amp;#x9875;&amp;#x9762;&amp;#x4E2D;&amp;#x6709;&amp;#x5927;&amp;#x91CF;&amp;#x7684;JavaScript&amp;#x65F6;&amp;#xFF0C;Unobtrusive JavaScript&amp;#x7684;&amp;#x4F18;&amp;#x52BF;&amp;#x624D;&amp;#x4F1A;&amp;#x663E;&amp;#x73B0;&amp;#x51FA;&amp;#x6765;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x76EE;&amp;#x524D;&amp;#x8FD9;&amp;#x79CD;&amp;#x505A;&amp;#x6CD5;&amp;#x6709;&amp;#x4E2A;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x5C31;&amp;#x662F;JavaScript&amp;#x7ECF;&amp;#x5E38;&amp;#x88AB;&amp;#x5199;&amp;#x5230;&amp;#x9759;&amp;#x6001;&amp;#x7684;&amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x88AB;&amp;#x5173;&amp;#x8054;&amp;#x8FDB;&amp;#x9875;&amp;#x9762;&amp;#x3002;&amp;#x90A3;&amp;#x4E48;&amp;#x6211;&amp;#x4EEC;&amp;#x5982;&amp;#x4F55;&amp;#x5C06;&amp;#x670D;&amp;#x52A1;&amp;#x7AEF;&amp;#x7684;&amp;#x52A8;&amp;#x6001;&amp;#x5185;&amp;#x5BB9;&amp;#x653E;&amp;#x5230;JavaScript&amp;#x4E2D;&amp;#x53BB;&amp;#xFF0C;&amp;#x800C;&amp;#x4E0D;&amp;#x4F7F;&amp;#x7528;&amp;#x5185;&amp;#x8054;&amp;#x7684;&amp;#x505A;&amp;#x6CD5;&amp;#x5462;&amp;#xFF1F;&lt;/p&gt;

&lt;p&gt;&amp;#x5728;HTML5&amp;#x4E2D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;&amp;#x52A8;&amp;#x6001;&amp;#x7684;&amp;#x6570;&amp;#x636E;&amp;#x5C5E;&amp;#x6027;&amp;#xFF08;data attribute&amp;#xFF09;&amp;#x6765;&amp;#x5B58;&amp;#x50A8;&amp;#x4E00;&amp;#x4E2A;&amp;#x5143;&amp;#x7D20;&amp;#x7684;&amp;#x76F8;&amp;#x5173;&amp;#x6570;&amp;#x636E;&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&amp;#x52A8;&amp;#x6001;&amp;#x5C5E;&amp;#x6027;&amp;#x548C;&amp;#x5176;&amp;#x4ED6;&amp;#x7684;&amp;#x5143;&amp;#x7D20;&amp;#x5C5E;&amp;#x6027;&amp;#x4E00;&amp;#x6837;&amp;#xFF0C;&amp;#x53EA;&amp;#x662F;&amp;#x5C5E;&amp;#x6027;&amp;#x540D;&amp;#x8981;&amp;#x4EE5; &lt;strong&gt;data-&lt;/strong&gt;
 &amp;#x5F00;&amp;#x5934;&amp;#x3002;&amp;#x4E3A;&amp;#x4E86;&amp;#x5B58;&amp;#x50A8;&amp;#x6211;&amp;#x4EEC;&amp;#x70B9;&amp;#x51FB;&amp;#x94FE;&amp;#x63A5;&amp;#x5F39;&amp;#x51FA;&amp;#x7684;&amp;#x63D0;&amp;#x793A;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x628A;&amp;#x94FE;&amp;#x63A5;&amp;#x6539;&amp;#x5199;&amp;#x6210;&amp;#x5982;&amp;#x4E0B;&amp;#x5F62;&amp;#x5F0F;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;lt;a href=&amp;quot;#&amp;quot; id=&amp;quot;alert&amp;quot; data-message=&amp;quot;Hello from UJS&amp;quot;&amp;gt;Click Here&amp;lt;/a&amp;gt; 
&lt;/pre&gt;

&lt;p&gt;&amp;#x5728;JavaScript&amp;#x4E2D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x6539;&amp;#x5199;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x4ECE;&amp;#x94FE;&amp;#x63A5;&amp;#x7684;&amp;#x65B0;&amp;#x5C5E;&amp;#x6027;&amp;#x4E2D;&amp;#x53D6;&amp;#x51FA;&amp;#x4FE1;&amp;#x606F;&amp;#x7136;&amp;#x540E;&amp;#x7528;alert&amp;#x63D0;&amp;#x793A;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x8BD1;&amp;#x8005;&amp;#x6CE8;&amp;#xFF1A;data attribute&amp;#x662F;HTML5&amp;#x7684;&amp;#x65B0;&amp;#x7279;&amp;#x6027;&amp;#x4E4B;&amp;#x4E00;&amp;#xFF0C;&amp;#x7528;&amp;#x4E8E;&amp;#x7ED9;&amp;#x4E00;&amp;#x4E2A;&amp;#x5143;&amp;#x7D20;&amp;#x5B58;&amp;#x50A8;&amp;#x6570;&amp;#x636E;&amp;#x4FE1;&amp;#x606F;&amp;#x3002;HTML5&amp;#x4E5F;&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x5BF9;&amp;#x5E94;&amp;#x7684;JavaScript&amp;#x63A5;&amp;#x53E3;&amp;#x6765;&amp;#x8BBF;&amp;#x95EE;&amp;#x8FD9;&amp;#x4E9B;&amp;#x6570;&amp;#x636E;&amp;#x5C5E;&amp;#x6027;&amp;#x3002;&amp;#x4EE5;&amp;#x4E0B;&amp;#x9762;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x4E3A;&amp;#x4F8B;&amp;#xFF0C;&amp;#x83B7;&amp;#x53D6;&amp;#x94FE;&amp;#x63A5;&amp;#x7684;data-message&amp;#x5C5E;&amp;#x6027;&amp;#x8FD8;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;this.dataset.message&amp;#x3002;&amp;#x4F46;&amp;#x76EE;&amp;#x524D;&amp;#x4F3C;&amp;#x4E4E;&amp;#x6CA1;&amp;#x6709;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x652F;&amp;#x6301;&amp;#x8FD9;&amp;#x79CD;&amp;#x8BED;&amp;#x6CD5;&amp;hellip;&amp;hellip;&amp;#x6240;&amp;#x4EE5;&amp;#xFF0C;&amp;#x76EE;&amp;#x524D;&amp;#x53EA;&amp;#x80FD;&amp;#x7528;&amp;#x4F20;&amp;#x7EDF;&amp;#x7684;getAttribute&amp;#x65B9;&amp;#x6CD5;&amp;#x83B7;&amp;#x53D6;&amp;#x81EA;&amp;#x5B9A;&amp;#x4E49;&amp;#x5C5E;&amp;#x6027;&amp;#x3002;&amp;#x81F3;&amp;#x4E8E;&amp;#x628A;&amp;#x81EA;&amp;#x5B9A;&amp;#x4E49;&amp;#x5C5E;&amp;#x6027;&amp;#x4EE5; data- &amp;#x5F00;&amp;#x5934;&amp;#x7684;&amp;#x552F;&amp;#x4E00;&amp;#x4F5C;&amp;#x7528;&amp;#xFF0C;&amp;#x5C31;&amp;#x662F;&amp;#x8BA9;HTML&amp;#x6587;&amp;#x6863;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;W3C&amp;#x7684;HTML 5&amp;#x6807;&amp;#x51C6;&amp;#x68C0;&amp;#x9A8C;&amp;#x3002;&lt;/p&gt;

&lt;pre class="js"&gt;$(function () {  
  $(&amp;#x27;#alert&amp;#x27;).click(function () {  
    alert(this.getAttribute(&amp;#x27;data-message&amp;#x27;));  
    return false;  
   })  
}); &lt;/pre&gt;

&lt;p&gt;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;#x5B58;&amp;#x50A8;&amp;#x5728;&amp;#x6570;&amp;#x636E;&amp;#x5C5E;&amp;#x6027;&amp;#x4E2D;&amp;#x7684;&amp;#x63D0;&amp;#x793A;&amp;#x4FE1;&amp;#x606F;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/344/original/E205I02.png" width="747" height="440" alt="The alert created by unobtrusive JavaScript."/&gt;
&lt;/div&gt;

&lt;h3&gt;Rails 3 &amp;#x5982;&amp;#x4F55;&amp;#x4F7F;&amp;#x7528;&amp;#x6570;&amp;#x636E;&amp;#x5C5E;&amp;#x6027;&lt;/h3&gt;

&lt;p&gt;Rails 3 &amp;#x7528;&amp;#x5B83;&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x53BB;&amp;#x5229;&amp;#x7528;&amp;#x8FD9;&amp;#x4E9B;&amp;#x81EA;&amp;#x5B9A;&amp;#x4E49;&amp;#x7684;&amp;#x6570;&amp;#x636E;&amp;#x5C5E;&amp;#x6027;&amp;#x6765;&amp;#x5C06;&amp;#x503C;&amp;#x4F20;&amp;#x7ED9;Unobtrusive JavaScript&amp;#x3002;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x6765;&amp;#x770B;&amp;#x770B;&amp;#x4E00;&amp;#x4E2A;Rails 3&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x600E;&amp;#x4E48;&amp;#x53BB;&amp;#x5E94;&amp;#x7528;&amp;#x5B83;&amp;#x4EEC;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;web&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;&amp;#x7535;&amp;#x5B50;&amp;#x5546;&amp;#x52A1;&amp;#x7F51;&amp;#x7AD9;&amp;#xFF0C;&amp;#x7528;&amp;#x6237;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;&amp;#x4E0A;&amp;#x9762;&amp;#x67E5;&amp;#x8BE2;&amp;#x4EA7;&amp;#x54C1;&amp;#x4FE1;&amp;#x606F;&amp;#x3002;&amp;#x6BCF;&amp;#x4E2A;&amp;#x4EA7;&amp;#x54C1;&amp;#x90FD;&amp;#x6709;&amp;#x76F8;&amp;#x5E94;&amp;#x7684;edit&amp;#x548C;destroy&amp;#x94FE;&amp;#x63A5;&amp;#x3002;&amp;#x4F46;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x70B9;&amp;#x51FB;destroy&amp;#x94FE;&amp;#x63A5;&amp;#x65F6;&amp;#xFF0C;&amp;#x5374;&amp;#x53D1;&amp;#x73B0;&amp;#x5B83;&amp;#x4F3C;&amp;#x4E4E;&amp;#x5E76;&amp;#x6CA1;&amp;#x6709;&amp;#x6B63;&amp;#x5E38;&amp;#x5DE5;&amp;#x4F5C;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/345/original/E205I03.png" width="800" height="357" alt="The product page with the non-working destroy link."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x5BF9;&amp;#x4E8E;Rails 3&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;&amp;#x5F88;&amp;#x666E;&amp;#x904D;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x521A;&amp;#x5EFA;&amp;#x7ACB;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#xFF0C;&amp;#x6216;&amp;#x8005;&amp;#x628A;&amp;#x4E00;&amp;#x4E2A;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4ECE;&amp;#x65E7;&amp;#x7248;&amp;#x672C;&amp;#x7684;Rails&amp;#x4E2D;&amp;#x8FC1;&amp;#x79FB;&amp;#x4E0A;&amp;#x6765;&amp;#xFF0C;&amp;#x4F60;&amp;#x5C31;&amp;#x4F1A;&amp;#x53D1;&amp;#x73B0;&amp;#x4E00;&amp;#x4E9B;&amp;#x4F7F;&amp;#x7528;&amp;#x4E86;JavaScript&amp;#x7684;&amp;#x90E8;&amp;#x5206;&amp;#x65E0;&amp;#x6CD5;&amp;#x5DE5;&amp;#x4F5C;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x4E0B;&amp;#x9762;&amp;#x662F;&amp;#x89C6;&amp;#x56FE;&amp;#x4E2D;&amp;#x7528;&amp;#x6765;&amp;#x751F;&amp;#x6210;Destroy&amp;#x94FE;&amp;#x63A5;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x3002;&amp;#x5B83;&amp;#x5C31;&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;&amp;#x666E;&amp;#x901A;&amp;#x7684; link_to &amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A; :confirm &amp;#x53C2;&amp;#x6570;&amp;#x7528;&amp;#x6765;&amp;#x63A7;&amp;#x5236;JavaScript&amp;#x7684; &lt;strong&gt;confirm&lt;/strong&gt;
 &amp;#x5F39;&amp;#x51FA;&amp;#x6846;&amp;#x7684;&amp;#x63D0;&amp;#x793A;&amp;#x4FE1;&amp;#x606F;&amp;#x3002;&amp;#x8FD8;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A; :method &amp;#x53C2;&amp;#x6570;&amp;#x88AB;&amp;#x8BBE;&amp;#x7F6E;&amp;#x4E3A; &lt;strong&gt;delete&lt;/strong&gt;
 &amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x8BF7;&amp;#x6C42;&amp;#x5C31;&amp;#x4F1A;&amp;#x4EE5;delete&amp;#x65B9;&amp;#x5F0F;&amp;#x800C;&amp;#x4E0D;&amp;#x662F;get&amp;#x65B9;&amp;#x5F0F;&amp;#x63D0;&amp;#x4EA4;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/products/show.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;%= link_to &amp;quot;Destroy&amp;quot;, @product, :confirm =&amp;gt; &amp;quot;Are you sure?&amp;quot;, :method =&amp;gt; :delete %&amp;gt;&lt;/pre&gt;


&lt;p&gt;&amp;#x6709;&amp;#x8DA3;&amp;#x7684;&amp;#x662F;&amp;#x5B83;&amp;#x751F;&amp;#x6210;&amp;#x7684;HTML&amp;#x6E90;&amp;#x4EE3;&amp;#x7801;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;lt;a href=&amp;quot;/products/8&amp;quot; data-confirm=&amp;quot;Are you sure?&amp;quot; data-method=&amp;quot;delete&amp;quot; rel=&amp;quot;nofollow&amp;quot;&amp;gt;Destroy&amp;lt;/a&amp;gt;&lt;/pre&gt;

&lt;p&gt;&amp;#x5728;Rails 2&amp;#x4E2D;&amp;#xFF0C;&amp;#x4F7F;&amp;#x7528; &lt;strong&gt;link_to&lt;/strong&gt;
 &amp;#x751F;&amp;#x6210;destroy&amp;#x94FE;&amp;#x63A5;&amp;#x4F1A;&amp;#x751F;&amp;#x6210;&amp;#x4E00;&amp;#x5806;&amp;#x5185;&amp;#x8054;JavaScript&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x5B83;&amp;#x7528;&amp;#x6765;&amp;#x521B;&amp;#x5EFA; &lt;strong&gt;confirm&lt;/strong&gt; &amp;#x5BF9;&amp;#x8BDD;&amp;#x6846;&amp;#xFF0C;&amp;#x8FD8;&amp;#x4F1A;&amp;#x751F;&amp;#x6210;&amp;#x4E00;&amp;#x4E2A;form&amp;#x53BB;&amp;#x6A21;&amp;#x62DF;delete&amp;#x8BF7;&amp;#x6C42;&amp;#x3002;&amp;#x76F8;&amp;#x6BD4;&amp;#x4E4B;&amp;#x4E0B;&amp;#xFF0C;Rails 3&amp;#x521B;&amp;#x5EFA;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x66F4;&amp;#x52A0;&amp;#x7684;&amp;#x7B80;&amp;#x6D01;&amp;#xFF0C;&amp;#x800C;&amp;#x4E14;&amp;#x4F7F;&amp;#x7528;&amp;#x5230;&amp;#x4E86;&amp;#x6211;&amp;#x4EEC;&amp;#x4E4B;&amp;#x524D;&amp;#x6240;&amp;#x8BB2;&amp;#x7684;HTML5&amp;#x6570;&amp;#x636E;&amp;#x5C5E;&amp;#x6027;&amp;#x3002;&amp;#x5176;&amp;#x4E2D; &lt;strong&gt;data-confirm&lt;/strong&gt;
 &amp;#x7528;&amp;#x6765;&amp;#x5B58;&amp;#x653E;&amp;#x786E;&amp;#x8BA4;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;data-method&amp;#x7528;&amp;#x6765;&amp;#x5B58;&amp;#x653E;&amp;#x8BF7;&amp;#x6C42;&amp;#x65B9;&amp;#x5F0F;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;destroy&amp;#x94FE;&amp;#x63A5;&amp;#x6CA1;&amp;#x6709;&amp;#x5DE5;&amp;#x4F5C;&amp;#x7684;&amp;#x539F;&amp;#x56E0;&amp;#x5C31;&amp;#x662F;&amp;#x6CA1;&amp;#x6709;&amp;#x5728;&amp;#x9875;&amp;#x9762;&amp;#x7684;head&amp;#x90E8;&amp;#x5206;&amp;#x5F15;&amp;#x5165;&amp;#x76F8;&amp;#x5E94;&amp;#x7684;JavaScript&amp;#x6587;&amp;#x4EF6;&amp;#x3002;&amp;#x6240;&amp;#x4EE5;&amp;#x8FD9;&amp;#x4E2A;&amp;#x94FE;&amp;#x63A5;&amp;#x5C31;&amp;#x4F1A;&amp;#x50CF;&amp;#x6B63;&amp;#x5E38;&amp;#x7684;&amp;#x94FE;&amp;#x63A5;&amp;#x90A3;&amp;#x6837;&amp;#x53D1;&amp;#x8D77;get&amp;#x8BF7;&amp;#x6C42;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#x6CA1;&amp;#x6709;&amp;#x4EBA;&amp;#x544A;&amp;#x8BC9;&amp;#x5B83;&amp;#x8BE5;&amp;#x505A;&amp;#x4EC0;&amp;#x4E48;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x4E3A;&amp;#x4E86;&amp;#x4FEE;&amp;#x590D;&amp;#x8FD9;&amp;#x4E2A;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;layout&amp;#x7684;head&amp;#x90E8;&amp;#x5206;&amp;#x52A0;&amp;#x5165;&amp;#x4EE5;&amp;#x4E0B;&amp;#x4E24;&amp;#x884C;&amp;#x4EE3;&amp;#x7801;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/layouts/application.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;%= javascript_include_tag :defaults %&amp;gt;  
&amp;lt;%= csrf_meta_tag %&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x7B2C;&amp;#x4E00;&amp;#x884C;&amp;#x4EE3;&amp;#x7801;&amp;#x5F88;&amp;#x773C;&amp;#x719F;&amp;#xFF0C;&amp;#x5B83;&amp;#x4F1A;&amp;#x52A0;&amp;#x8F7D;Rails&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x7684;&amp;#x57FA;&amp;#x672C;JavaScript&amp;#x6587;&amp;#x4EF6;&amp;#x3002;&amp;#x7B2C;&amp;#x4E8C;&amp;#x884C;&amp;#x4EE3;&amp;#x7801;&amp;#x4F1A;&amp;#x521B;&amp;#x5EFA;&amp;#x4E24;&amp;#x4E2A;meta&amp;#x6807;&amp;#x7B7E;&amp;#x6765;&amp;#x5B58;&amp;#x653E;authenticity token&amp;#x3002;&amp;#x5B83;&amp;#x4F1A;&amp;#x5728;delete&amp;#x8BF7;&amp;#x6C42;&amp;#x4E2D;&amp;#x7528;&amp;#x5230;&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#x540E;&amp;#x770B;&amp;#x770B;&amp;#x6E90;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x5C31;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;#x8FD9;&amp;#x4E24;&amp;#x884C;&amp;#x4EE3;&amp;#x7801;&amp;#x751F;&amp;#x6210;&amp;#x7684;HTML&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x8BD1;&amp;#x8005;&amp;#x6CE8;&amp;#xFF1A;&amp;#x6CE8;&amp;#x610F;&amp;#x591A;&amp;#x51FA;&amp;#x6765;&amp;#x7684;&amp;#x4E00;&amp;#x4E2A;&amp;#x811A;&amp;#x672C;rails.js&amp;#x3002;Rails 3
&amp;#x7684;Unobtrusive JavaScript&amp;#x5C31;&amp;#x5B58;&amp;#x653E;&amp;#x5728;&amp;#x8FD9;&amp;#x91CC;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;lt;script src=&amp;quot;/javascripts/prototype.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script src=&amp;quot;/javascripts/effects.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script src=&amp;quot;/javascripts/dragdrop.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script src=&amp;quot;/javascripts/controls.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script src=&amp;quot;/javascripts/rails.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;script src=&amp;quot;/javascripts/application.js?1268677667&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;  
&amp;lt;meta name=&amp;quot;csrf-param&amp;quot; content=&amp;quot;authenticity_token&amp;quot;/&amp;gt;  
&amp;lt;meta name=&amp;quot;csrf-token&amp;quot; content=&amp;quot;9ImdFvbeW7ih9oKqBDQ3O889q/hJ1q5uajpT4DFDAoA=&amp;quot;/&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x6709;&amp;#x4E86;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x6240;&amp;#x9700;&amp;#x7684;&amp;#x6240;&amp;#x6709;JavaScript&amp;#x6587;&amp;#x4EF6;&amp;#x548C;&amp;#x4E24;&amp;#x4E2A;meta&amp;#x6807;&amp;#x7B7E;&amp;#x3002;&amp;#x8FD9;&amp;#x4E24;&amp;#x4E2A;meta&amp;#x6807;&amp;#x7B7E;&amp;#x7528;&amp;#x6765;&amp;#x9632;&amp;#x6B62;&amp;#x8DE8;&amp;#x7AD9;&amp;#x70B9;&amp;#x7684;&amp;#x4F2A;&amp;#x9020;&amp;#x8BF7;&amp;#x6C42;&amp;#xFF0C;&amp;#x786E;&amp;#x4FDD;put&amp;#x548C;delete&amp;#x8BF7;&amp;#x6C42;&amp;#x6765;&amp;#x81EA;&amp;#x6B63;&amp;#x786E;&amp;#x7684;&amp;#x7528;&amp;#x6237;&amp;#xFF0C;&amp;#x800C;&amp;#x4E0D;&amp;#x662F;&amp;#x6765;&amp;#x81EA;&amp;#x5176;&amp;#x4ED6;&amp;#x7AD9;&amp;#x70B9;&amp;#x6216;&amp;#x9ED1;&amp;#x5BA2;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x73B0;&amp;#x5728;&amp;#x6709;&amp;#x4E86;&amp;#x8FD9;&amp;#x4E24;&amp;#x884C;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;destroy&amp;#x94FE;&amp;#x63A5;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x6B63;&amp;#x5E38;&amp;#x5DE5;&amp;#x4F5C;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/346/original/E205I04.png" width="802" height="360" alt="The destroy link now works."/&gt;
&lt;/div&gt;

&lt;h3&gt;&amp;#x4E3A;&amp;#x67E5;&amp;#x8BE2;&amp;#x8868;&amp;#x5355;&amp;#x63D0;&amp;#x4F9B;AJAX&amp;#x652F;&amp;#x6301;&lt;/h3&gt;

&lt;p&gt;&amp;#x4E0B;&amp;#x9762;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x4FEE;&amp;#x6539;index&amp;#x9875;&amp;#x9762;&amp;#x4E2D;&amp;#x8D1F;&amp;#x8D23;&amp;#x67E5;&amp;#x8BE2;&amp;#x7684;form&amp;#xFF0C;&amp;#x4F7F;&amp;#x5B83;&amp;#x7528;AJAX&amp;#x53D1;&amp;#x8D77;&amp;#x8BF7;&amp;#x6C42;&amp;#x800C;&amp;#x4E0D;&amp;#x662F;&amp;#x76F4;&amp;#x63A5;&amp;#x53D1;&amp;#x8D77;get&amp;#x8BF7;&amp;#x6C42;&amp;#x3002;index&amp;#x89C6;&amp;#x56FE;&amp;#x7684;form&amp;#x4EE3;&amp;#x7801;&amp;#x5982;&amp;#x4E0B;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;lt;% title &amp;quot;Products&amp;quot; %&amp;gt;  

&amp;lt;% form_tag products_path, :method =&amp;gt; :get do %&amp;gt;  
  &amp;lt;p&amp;gt;  
    &amp;lt;%= text_field_tag :search, params[:search] %&amp;gt;  
    &amp;lt;%= submit_tag &amp;quot;Search&amp;quot;, :name =&amp;gt; nil %&amp;gt;  
  &amp;lt;/p&amp;gt;  
&amp;lt;% end %&amp;gt;  

&amp;lt;div id=&amp;quot;products&amp;quot;&amp;gt;  
  &amp;lt;%= render @products %&amp;gt;  
&amp;lt;/div&amp;gt;  

&amp;lt;p&amp;gt;&amp;lt;%= link_to &amp;quot;New Product&amp;quot;, new_product_path %&amp;gt;&amp;lt;/p&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x91CC;&amp;#x7684;form&amp;#x4F7F;&amp;#x7528;&amp;#x4E86;&amp;#x6211;&amp;#x4EEC;&amp;#x5728; &lt;a title="&amp;#x7B2C;37&amp;#x96C6;" href="http://railscasts.com/episodes/37-simple-search-form"&gt;&amp;#x7B2C;37&amp;#x96C6;&lt;/a&gt;
 &amp;#x4E2D;&amp;#x8BB2;&amp;#x5230;&amp;#x7684;&amp;#x6280;&amp;#x672F;&amp;#x3002;&amp;#x5728;&amp;#x65E7;&amp;#x7248;&amp;#x672C;&amp;#x7684;Rails&amp;#x4E2D;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x8BA9;form&amp;#x4EE5;AJAX&amp;#x65B9;&amp;#x5F0F;&amp;#x63D0;&amp;#x4EA4;&amp;#xFF0C;&amp;#x5C31;&amp;#x8981;&amp;#x7528; &lt;strong&gt;form_remote_tag&lt;/strong&gt;
 &amp;#x6765;&amp;#x4EE3;&amp;#x66FF; &lt;strong&gt;form_tag&lt;/strong&gt;
&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&amp;#x65B9;&amp;#x6CD5;&amp;#x4F1A;&amp;#x751F;&amp;#x6210;&amp;#x5927;&amp;#x91CF;&amp;#x7684;&amp;#x5185;&amp;#x8054;JavaScript&amp;#xFF0C;&amp;#x800C;&amp;#x8FD9;&amp;#x79CD;&amp;#x60C5;&amp;#x51B5;&amp;#x6B63;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x4E00;&amp;#x76F4;&amp;#x60F3;&amp;#x907F;&amp;#x514D;&amp;#x7684;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x56E0;&amp;#x6B64;&amp;#xFF0C;&amp;#x65E7;&amp;#x7248;&amp;#x672C;&amp;#x4E2D;&amp;#x5F88;&amp;#x591A;remote&amp;#x7248;&amp;#x7684;helper&amp;#x65B9;&amp;#x6CD5;&amp;#x90FD;&amp;#x88AB;&amp;#x79FB;&amp;#x51FA;&amp;#x4E86;Rails 3&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x8FD8;&amp;#x60F3;&amp;#x4F7F;&amp;#x7528;&amp;#x8FD9;&amp;#x4E9B;&amp;#x65E7;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x5B89;&amp;#x88C5; &lt;a href="http://github.com/rails/prototype_legacy_helper"&gt;Prototype Legacy Helper&lt;/a&gt;
 &amp;#x8FD9;&amp;#x4E2A;&amp;#x63D2;&amp;#x4EF6;&amp;#x6765;&amp;#x4EE3;&amp;#x66FF;Rails 3&amp;#x7684;&amp;#x65B0;&amp;#x65B9;&amp;#x5F0F;&amp;#xFF08;Unobtrusive JavaScript&amp;#xFF09;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0B;&amp;#x9762;&amp;#x4F1A;&amp;#x8BB2;&amp;#x5230;&amp;#x8FD9;&amp;#x79CD;&amp;#x65B0;&amp;#x7684;&amp;#x505A;&amp;#x6CD5;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x7EE7;&amp;#x7EED;&amp;#x4F7F;&amp;#x7528; &lt;strong&gt;form_tag&lt;/strong&gt;
&amp;#xFF0C;&amp;#x800C;&amp;#x4E0D;&amp;#x662F; &lt;strong&gt;form_remote_tag&lt;/strong&gt;
&amp;#x3002;&amp;#x4F46;&amp;#x7ED9;&amp;#x5B83;&amp;#x52A0;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x53C2;&amp;#x6570; &lt;strong&gt;:remote&lt;/strong&gt;
&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/products/index.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;% form_tag products_path, :method =&amp;gt; :get, :remote =&amp;gt; true do %&amp;gt;  
  &amp;lt;p&amp;gt;  
    &amp;lt;%= text_field_tag :search, params[:search] %&amp;gt;  
    &amp;lt;%= submit_tag &amp;quot;Search&amp;quot;, :name =&amp;gt; nil %&amp;gt;  
  &amp;lt;/p&amp;gt;  
&amp;lt;% end 
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A; &lt;strong&gt;:remote&lt;/strong&gt; &amp;#x53C2;&amp;#x6570;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;&amp;#x5728;&amp;#x5176;&amp;#x4ED6;helper&amp;#x65B9;&amp;#x6CD5;&amp;#x4E2D;&amp;#xFF0C;&amp;#x5982; &lt;strong&gt;link_to&lt;/strong&gt;
&amp;#xFF0C;&lt;strong&gt;button_to&lt;/strong&gt;
&amp;#xFF0C;&lt;strong&gt;form_for&lt;/strong&gt;
&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#x7136;&amp;#x540E;&amp;#x67E5;&amp;#x770B;&amp;#x6E90;&amp;#x7801;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;#x65B0;&amp;#x7684;form&amp;#x4EE3;&amp;#x7801;&amp;#x5982;&amp;#x4E0B;&amp;#x6240;&amp;#x793A;&amp;#xFF1A;&lt;/p&gt;


&lt;pre class="ruby"&gt;
&amp;lt;form action=&amp;quot;/products&amp;quot; data-remote=&amp;quot;true&amp;quot; method=&amp;quot;get&amp;quot;&amp;gt;  &amp;lt;p&amp;gt;  
    &amp;lt;input id=&amp;quot;search&amp;quot; name=&amp;quot;search&amp;quot; type=&amp;quot;text&amp;quot; /&amp;gt;  
    &amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Search&amp;quot; /&amp;gt;  
  &amp;lt;/p&amp;gt;  
&amp;lt;/form&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x65B0;&amp;#x7684;form&amp;#x6807;&amp;#x7B7E;&amp;#x548C;&amp;#x6CA1;&amp;#x4F7F;&amp;#x7528; &lt;strong&gt;:remote&lt;/strong&gt; &amp;#x53C2;&amp;#x6570;&amp;#x4E4B;&amp;#x524D;&amp;#x7684;&amp;#x7248;&amp;#x672C;&amp;#x6CA1;&amp;#x4EC0;&amp;#x4E48;&amp;#x533A;&amp;#x522B;&amp;#xFF0C;&amp;#x53EA;&amp;#x662F;&amp;#x52A0;&amp;#x4E86;&amp;#x4E00;&amp;#x4E2A; &lt;strong&gt;data-remote&lt;/strong&gt; &amp;#x5C5E;&amp;#x6027;&amp;#x3002;&amp;#x8FD9;&amp;#x8DB3;&amp;#x4EE5;&amp;#x544A;&amp;#x8BC9; &lt;strong&gt;rails.js&lt;/strong&gt; &amp;#x6587;&amp;#x4EF6;&amp;#x4E2D;&amp;#x7684;JavaScript&amp;#xFF0C;&amp;#x8BA9;form&amp;#x4EE5;AJAX&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x63D0;&amp;#x4EA4;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5BA2;&amp;#x6237;&amp;#x7AEF;&amp;#x7684;&amp;#x6539;&amp;#x9020;&amp;#x5B8C;&amp;#x6210;&amp;#x4E86;&amp;#xFF0C;&amp;#x4E0B;&amp;#x9762;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x5199;&amp;#x670D;&amp;#x52A1;&amp;#x7AEF;&amp;#x4EE3;&amp;#x7801;&amp;#x6765;&amp;#x54CD;&amp;#x5E94;AJAX&amp;#x8BF7;&amp;#x6C42;&amp;#x3002;&amp;#x4EA7;&amp;#x54C1;&amp;#x5217;&amp;#x8868;&amp;#x90FD;&amp;#x5305;&amp;#x542B;&amp;#x5728;&amp;#x4E00;&amp;#x4E2A; &lt;strong&gt;id&lt;/strong&gt; &amp;#x4E3A;products&amp;#x7684; &lt;strong&gt;div&lt;/strong&gt; &amp;#x4E2D;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x66F4;&amp;#x65B0;&amp;#x8FD9;&amp;#x4E2A;div&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#x6765;&amp;#x663E;&amp;#x793A;&amp;#x67E5;&amp;#x8BE2;&amp;#x51FA;&amp;#x6765;&amp;#x7684;&amp;#x4EA7;&amp;#x54C1;&amp;#x3002;form&amp;#x7684;&amp;#x63D0;&amp;#x4EA4;&amp;#x8BF7;&amp;#x6C42;&amp;#x5C06;&amp;#x7531; &lt;strong&gt;ProductsController&lt;/strong&gt; &amp;#x7684; &lt;strong&gt;index&lt;/strong&gt; &amp;#x65B9;&amp;#x6CD5;&amp;#x5904;&amp;#x7406;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x73B0;&amp;#x5728;&amp;#x8981;&amp;#x505A;&amp;#x7684;&amp;#x5C31;&amp;#x662F;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E2A;&amp;#x65B0;&amp;#x7684;&amp;#x89C6;&amp;#x56FE; &lt;strong&gt;index.js.erb&lt;/strong&gt;
 &amp;#x6765;&amp;#x5904;&amp;#x7406;js&amp;#x8BF7;&amp;#x6C42;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;&amp;#x8FD9;&amp;#x4E2A;&amp;#x89C6;&amp;#x56FE;&amp;#x4E2D;&amp;#x6309;&amp;#x81EA;&amp;#x5DF1;&amp;#x7684;&amp;#x559C;&amp;#x597D;&amp;#x5199;JavaScript&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x5B83;&amp;#x4F1A;&amp;#x5728;&amp;#x5BA2;&amp;#x6237;&amp;#x7AEF;&amp;#x6267;&amp;#x884C;&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&amp;#x65B0;&amp;#x89C6;&amp;#x56FE;&amp;#x4E2D;&amp;#x7684;JavaScript&amp;#x4EE3;&amp;#x7801;&amp;#x7528;&amp;#x6765;&amp;#x66F4;&amp;#x65B0; div &amp;#x4E2D;&amp;#x7684;&amp;#x4EA7;&amp;#x54C1;&amp;#x4FE1;&amp;#x606F;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/products/index.js.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
$(&amp;quot;products&amp;quot;).update(&amp;quot;&amp;lt;%= escape_javascript(render(@products)) %&amp;gt;&amp;quot;);
&lt;/pre&gt;

&lt;p&gt;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#x7136;&amp;#x540E;&amp;#x67E5;&amp;#x8BE2;&amp;#x4E00;&amp;#x6B21;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;#x5B83;&amp;#x5DF2;&amp;#x7ECF;&amp;#x53D8;&amp;#x6210;&amp;#x4E86;AJAX&amp;#x8BF7;&amp;#x6C42;&amp;#xFF0C;&amp;#x800C;&amp;#x4E14;&amp;#x9875;&amp;#x9762;&amp;#x7684;URL&amp;#x6CA1;&amp;#x6709;&amp;#x53D1;&amp;#x751F;&amp;#x53D8;&amp;#x5316;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/347/original/E205I05.png" width="801" height="409" alt="The search form working with AJAX."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x603B;&amp;#x800C;&amp;#x8A00;&amp;#x4E4B;&amp;#xFF0C;&amp;#x901A;&amp;#x8FC7;&amp;#x4F7F;&amp;#x7528; :remote &amp;#x53C2;&amp;#x6570;&amp;#x548C;&amp;#x6267;&amp;#x884C;&amp;#x670D;&amp;#x52A1;&amp;#x7AEF;&amp;#x8FD4;&amp;#x56DE;&amp;#x7684;JavaScript&amp;#x4EE3;&amp;#x7801;&amp;#x3002;Rails 3&amp;#x53EF;&amp;#x4EE5;&amp;#x5F88;&amp;#x5BB9;&amp;#x6613;&amp;#x5730;&amp;#x505A;&amp;#x5230;Unobtrusive JavaScript&amp;#x65B9;&amp;#x5F0F;&amp;#x7684;AJAX&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;&amp;#x5207;&amp;#x6362;JavaScript&amp;#x6846;&amp;#x67B6;&lt;/h3&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x6700;&amp;#x540E;&amp;#x52A0;&amp;#x4E00;&amp;#x70B9;&amp;#x82B1;&amp;#x7D6E;&amp;#xFF0C;&amp;#x6F14;&amp;#x793A;&amp;#x4E00;&amp;#x4E0B;&amp;#x5982;&amp;#x4F55;&amp;#x5207;&amp;#x6362;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x7A0B;&amp;#x5E8F;&amp;#x4F7F;&amp;#x7528;&amp;#x7684;JavaScript&amp;#x6846;&amp;#x67B6;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x76EE;&amp;#x524D;&amp;#x7684;&amp;#x7A0B;&amp;#x5E8F;&amp;#x9ED8;&amp;#x8BA4;&amp;#x4F7F;&amp;#x7528;Rails&amp;#x81EA;&amp;#x5E26;&amp;#x7684;Prototype&amp;#xFF0C;&amp;#x4F46;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x6362;&amp;#x6210;jQuery&amp;#x8BE5;&amp;#x600E;&amp;#x4E48;&amp;#x529E;&amp;#x5462;&amp;#xFF1F;&lt;/p&gt;

&lt;p&gt;&amp;#x9996;&amp;#x5148;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x628A;application layout&amp;#x4E2D;&amp;#x7684;&amp;#x8FD9;&amp;#x6BB5;&amp;#x4EE3;&amp;#x7801;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/layouts/application.html.erb&lt;/p&gt;
&lt;pre  class="ruby"&gt;
&amp;lt;%= javascript_include_tag :defaults %&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x6362;&amp;#x6210;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;lt;%= javascript_include_tag &amp;quot;http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js&amp;quot;, &amp;quot;jquery.rails.js&amp;quot; %&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x7B2C;&amp;#x4E00;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x4ECE;google&amp;#x4E0A;&amp;#x83B7;&amp;#x53D6;&amp;#x7684;jQuery&amp;#x6700;&amp;#x65B0;&amp;#x7248;&amp;#xFF0C;&amp;#x4F46;&amp;#x8FD9;&amp;#x6837;&amp;#x8FD8;&amp;#x4E0D;&amp;#x591F;&amp;#xFF0C;&amp;#x56E0;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD8;&amp;#x9700;&amp;#x8981;&amp;#x4E3A; &lt;strong&gt;rails.js&lt;/strong&gt;
 &amp;#x627E;&amp;#x4E00;&amp;#x4E2A;jQuery&amp;#x66FF;&amp;#x4EE3;&amp;#x7248;&amp;#x672C;&amp;#x3002;&amp;#x5B83;&amp;#x8D1F;&amp;#x8D23;&amp;#x5B58;&amp;#x653E;&amp;#x548C;Rails&amp;#x76F8;&amp;#x5173;&amp;#x7684; Unobtrusive JavaScript &amp;#x4EE3;&amp;#x7801;&amp;#x3002;&amp;#x4F60;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728; &lt;a href="http://github.com/rails/jquery-ujs"&gt;jquery-ujs project on 
Github&lt;/a&gt;
 &amp;#x627E;&amp;#x5230;&amp;#x5B98;&amp;#x65B9;&amp;#x7248;&amp;#x672C;&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&amp;#x9879;&amp;#x76EE;&amp;#x5305;&amp;#x542B;&amp;#x4E86;&amp;#x6211;&amp;#x4EEC;&amp;#x6240;&amp;#x9700;&amp;#x7684; &lt;strong&gt;rails.js&lt;/strong&gt;
 &amp;#x6587;&amp;#x4EF6;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x628A;&amp;#x5B83;&amp;#x4E0B;&amp;#x8F7D;&amp;#x5230; &lt;strong&gt;public/javascripts&lt;/strong&gt;
 &amp;#x76EE;&amp;#x5F55;&amp;#x7136;&amp;#x540E;&amp;#x5C06;&amp;#x5B83;&amp;#x6539;&amp;#x540D;&amp;#x4E3A; &lt;strong&gt;jquery.rails.js&lt;/strong&gt;
&amp;#x3002;&amp;#x8FD9;&amp;#x5C31;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x7B2C;&amp;#x4E8C;&amp;#x4E2A;&amp;#x6587;&amp;#x4EF6;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x628A;&amp;#x539F;&amp;#x6765;&amp;#x5199;&amp;#x8FC7;&amp;#x7684;Prototype&amp;#x4EE3;&amp;#x7801;&amp;#x6539;&amp;#x6210;jQuery&amp;#x7248;&amp;#x7684;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x9700;&amp;#x8981;&amp;#x5BF9;&amp;#x4E4B;&amp;#x524D;&amp;#x521B;&amp;#x5EFA;&amp;#x7684; &lt;strong&gt;index.js.erb&lt;/strong&gt; &amp;#x505A;&amp;#x4E24;&amp;#x5904;&amp;#x6539;&amp;#x52A8;&amp;#x3002;&amp;#x7528; &lt;strong&gt;#products&lt;/strong&gt; &amp;#x9009;&amp;#x62E9;&amp;#x5668;&amp;#x66FF;&amp;#x6362;&amp;#x539F;&amp;#x5148;&amp;#x7684; &lt;strong&gt;product&lt;/strong&gt; &amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x628A; &lt;strong&gt;update&lt;/strong&gt; &amp;#x65B9;&amp;#x6CD5;&amp;#x6362;&amp;#x6210;jQuery&amp;#x4E2D;&amp;#x7684; &lt;strong&gt;html&lt;/strong&gt; &amp;#x65B9;&amp;#x6CD5;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/products/index.js.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
$(&amp;quot;#products&amp;quot;).html(&amp;quot;&amp;lt;%= escape_javascript(render(@products)) %&amp;gt;&amp;quot;);
&lt;/pre&gt;

&lt;p&gt;&amp;#x73B0;&amp;#x5728;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x7A0B;&amp;#x5E8F;&amp;#x8FD8;&amp;#x662F;&amp;#x548C;&amp;#x4EE5;&amp;#x524D;&amp;#x4E00;&amp;#x6837;&amp;#x6B63;&amp;#x5E38;&amp;#x5DE5;&amp;#x4F5C;&amp;#xFF0C;&amp;#x53EA;&amp;#x662F;&amp;#x5E95;&amp;#x5C42;&amp;#x6846;&amp;#x67B6;&amp;#x5DF2;&amp;#x7ECF;&amp;#x6362;&amp;#x6210;&amp;#x4E86;jQuery&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;&amp;#x4F18;&amp;#x96C5;&amp;#x7684;&amp;#x964D;&amp;#x7EA7;&lt;/h3&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x7528;&amp;#x6237;&amp;#x4F7F;&amp;#x7528;&amp;#x7981;&amp;#x7528;&amp;#x4E86;JavaScript&amp;#x7684;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x8BBF;&amp;#x95EE;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x7F51;&amp;#x7AD9;&amp;#xFF0C;&amp;#x67E5;&amp;#x8BE2;form&amp;#x5C31;&amp;#x4F1A;&amp;#x81EA;&amp;#x52A8;&amp;#x964D;&amp;#x7EA7;&amp;#x6210;&amp;#x4F7F;&amp;#x7528;get&amp;#x8BF7;&amp;#x6C42;&amp;#x53D1;&amp;#x8D77;&amp;#x63D0;&amp;#x4EA4;&amp;#x3002;&amp;#x4F46;destroy&amp;#x94FE;&amp;#x63A5;&amp;#x5C31;&amp;#x65E0;&amp;#x6CD5;&amp;#x662F;&amp;#x4F7F;&amp;#x7528;&amp;#x4E86;&amp;#x3002;&amp;#x56E0;&amp;#x4E3A;&amp;#x94FE;&amp;#x63A5;&amp;#x53EA;&amp;#x80FD;&amp;#x4F7F;&amp;#x7528;get&amp;#x8BF7;&amp;#x6C42;&amp;#xFF0C;&amp;#x800C;Rails&amp;#x662F;&amp;#x4F7F;&amp;#x7528;JavaScript&amp;#x6765;&amp;#x6A21;&amp;#x62DF;delete&amp;#x8BF7;&amp;#x6C42;&amp;#x7684;&amp;#x3002;&amp;#x4E00;&amp;#x4E2A;&amp;#x89E3;&amp;#x51B3;&amp;#x529E;&amp;#x6CD5;&amp;#x5C31;&amp;#x662F;&amp;#x4F7F;&amp;#x7528; &lt;strong&gt;button_to&lt;/strong&gt;
 &amp;#x751F;&amp;#x6210;&amp;#x7684;&amp;#x6309;&amp;#x94AE;&amp;#x6765;&amp;#x4EE3;&amp;#x66FF;&amp;#x94FE;&amp;#x63A5;&amp;#x3002;&amp;#x4F46;&amp;#x6309;&amp;#x94AE;&amp;#x5B9E;&amp;#x5728;&amp;#x770B;&amp;#x8D77;&amp;#x6765;&amp;#x592A;&amp;#x4E11;&amp;#x4E86;&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x60F3;&amp;#x7EE7;&amp;#x7EED;&amp;#x4F7F;&amp;#x7528;&amp;#x94FE;&amp;#x63A5;&amp;#xFF0C;&amp;#x4E00;&amp;#x4E2A;&amp;#x66F4;&amp;#x597D;&amp;#x7684;&amp;#x529E;&amp;#x6CD5;&amp;#x662F;&amp;#x4F7F;&amp;#x7528; &lt;a href="http://railscasts.com/episodes/77-destroy-without-javascript"&gt;&amp;#x7B2C;77&amp;#x96C6;&lt;/a&gt; &amp;#x6240;&amp;#x8BB2;&amp;#x7684;&amp;#x6280;&amp;#x672F;&amp;#xFF0C;&amp;#x5728;&amp;#x5220;&amp;#x9664;&amp;#x4E4B;&amp;#x524D;&amp;#x663E;&amp;#x793A;&amp;#x4E00;&amp;#x4E2A;&amp;#x5355;&amp;#x72EC;&amp;#x7684;&amp;#x786E;&amp;#x8BA4;&amp;#x9875;&amp;#x9762;&amp;#x3002;&lt;/p&gt;</description>
      <pubDate>Wed, 24 Mar 2010 08:04:46 +0000</pubDate>
      <guid>http://cn.asciicasts.com/episodes/205-unobtrusive-javascript</guid>
      <link>http://cn.asciicasts.com/episodes/205-unobtrusive-javascript</link>
    </item>
    <item>
      <title>XSS Protection in Rails 3</title>
      <description>&lt;p&gt;&amp;#x56DE;&amp;#x987E;&amp;#x7B2C;27&amp;#x96C6;[&lt;a href="http://railscasts.com/episodes/27-cross-site-scripting"&gt;&amp;#x89C2;&amp;#x770B;&lt;/a&gt;, &lt;a href="http://asciicasts.com/episodes/27-cross-site-scripting"&gt;&amp;#x9605;&amp;#x8BFB;&lt;/a&gt;]&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x8BE6;&amp;#x7EC6;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;&amp;#x8DE8;&amp;#x7AD9;&amp;#x811A;&amp;#x672C;&amp;#x653B;&amp;#x51FB;&amp;#x3002;&amp;#x8FD9;&amp;#x662F;&amp;#x6BCF;&amp;#x4E2A;&amp;#x7F51;&amp;#x7AD9;&amp;#x5F00;&amp;#x53D1;&amp;#x4EBA;&amp;#x5458;&amp;#x90FD;&amp;#x5E94;&amp;#x8BE5;&amp;#x638C;&amp;#x63E1;&amp;#x7684;&amp;#x4E00;&amp;#x95E8;&amp;#x91CD;&amp;#x8981;&amp;#x8BFE;&amp;#x7A0B;&amp;#x3002;&amp;#x5728;web&amp;#x5E94;&amp;#x7528;&amp;#x4E2D;&amp;#xFF0C;&amp;#x5F53;&amp;#x7F51;&amp;#x9875;&amp;#x663E;&amp;#x793A;&amp;#x7528;&amp;#x6237;&amp;#x7684;&amp;#x8F93;&amp;#x5165;&amp;#x5185;&amp;#x5BB9;&amp;#x65F6;&amp;#x6613;&amp;#x53D7;&amp;#x5230;xss&amp;#x653B;&amp;#x51FB;&amp;#x3002;&amp;#x56E0;&amp;#x6B64;&amp;#xFF0C;&amp;#x8F6C;&amp;#x4E49;&amp;#x7528;&amp;#x6237;&amp;#x81EA;&amp;#x884C;&amp;#x8F93;&amp;#x5165;&amp;#x5185;&amp;#x5BB9;&amp;#x662F;&amp;#x5F88;&amp;#x91CD;&amp;#x8981;&amp;#x7684;&amp;#xFF0C;&amp;#x5728;Rails&amp;#x5E94;&amp;#x7528;&amp;#x4E2D;&amp;#xFF0C;&amp;#x901A;&amp;#x5E38;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;h&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x6765;&amp;#x5B8C;&amp;#x6210;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;lt;%= h comment.content %&amp;gt;
&lt;/pre&gt;
&lt;p class="title"&gt;&amp;#x4F7F;&amp;#x7528;h&amp;#x65B9;&amp;#x6CD5;&amp;#x8F6C;&amp;#x4E49;&amp;#x8F93;&amp;#x51FA;&lt;/p&gt;

&lt;p&gt;&amp;#x5728;Rails 3&amp;#x4E2D;&amp;#xFF0C;&amp;#x8F93;&amp;#x51FA;&amp;#x53EF;&amp;#x4EE5;&amp;#x81EA;&amp;#x52A8;&amp;#x8F6C;&amp;#x4E49;&amp;#xFF0C;&amp;#x56E0;&amp;#x6B64;&amp;#xFF0C;&amp;#x65E0;&amp;#x9700;&amp;#x5728;&amp;#x4F60;&amp;#x7684;&amp;#x89C6;&amp;#x56FE;&amp;#x4E2D;&amp;#x518D;&amp;#x52A0;&amp;#x5165;&lt;code&gt;h&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x3002;&amp;#x5728;&amp;#x6B64;&amp;#x96C6;&amp;#x4E2D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x5411;&amp;#x4F60;&amp;#x5C55;&amp;#x793A;Rails3&amp;#x5982;&amp;#x4F55;&amp;#x5904;&amp;#x7406;&amp;#x8F93;&amp;#x51FA;&amp;#x8F6C;&amp;#x4E49;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x4E3A;&amp;#x4E86;&amp;#x6F14;&amp;#x793A;&amp;#x8F93;&amp;#x51FA;&amp;#x8F6C;&amp;#x4E49;&amp;#x673A;&amp;#x5236;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x4F7F;&amp;#x7528;&amp;#x4E00;&amp;#x4E2A;&amp;#x7528;Rails 3 &amp;#x7F16;&amp;#x5199;&amp;#x7684;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x535A;&amp;#x5BA2;&amp;#x5E94;&amp;#x7528;&amp;#x3002;&amp;#x5728;&amp;#x8FD9;&amp;#x4E2A;&amp;#x5E94;&amp;#x7528;&amp;#x4E2D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x62E5;&amp;#x6709;&amp;#x5F88;&amp;#x591A;&amp;#x6587;&amp;#x7AE0;&amp;#xFF0C;&amp;#x800C;&amp;#x4E14;&amp;#x6BCF;&amp;#x7BC7;&amp;#x6587;&amp;#x7AE0;&amp;#x90FD;&amp;#x6709;&amp;#x5F88;&amp;#x591A;&amp;#x76F8;&amp;#x5173;&amp;#x7684;&amp;#x8BC4;&amp;#x8BBA;&amp;#x3002;&amp;#x4E3A;&amp;#x6D4B;&amp;#x8BD5;&amp;#x8BC4;&amp;#x8BBA;&amp;#x7CFB;&amp;#x7EDF;&amp;#x5982;&amp;#x4F55;&amp;#x5E94;&amp;#x5BF9;&amp;#x8DE8;&amp;#x7AD9;&amp;#x811A;&amp;#x672C;&amp;#x653B;&amp;#x51FB;&amp;#x7684;&amp;#x5C1D;&amp;#x8BD5;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x8BC4;&amp;#x8BBA;&amp;#x8868;&amp;#x5355;&amp;#x7684;&amp;#x6BCF;&amp;#x4E2A;&amp;#x5B57;&amp;#x6BB5;&amp;#x4E2D;&amp;#x90FD;&amp;#x8F93;&amp;#x5165;&lt;code&gt;&amp;lt;script&amp;gt;alert(&amp;#x27;I steal cookies!&amp;#x27;)&amp;lt;/script&amp;gt;&lt;/code&gt;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x63D0;&amp;#x4EA4;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6076;&amp;#x610F;&amp;#x7684;&amp;#x8BC4;&amp;#x8BBA;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img width="815" height="527" alt="Entering an evil comment." src="/system/photos/338/original/E204I01.png" /&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x6DFB;&amp;#x52A0;&amp;#x7684;&amp;#x8FD9;&amp;#x4E2A;&amp;#x8BC4;&amp;#x8BBA;&amp;#x5728;&amp;#x7F51;&amp;#x9875;&amp;#x4E0A;&amp;#x663E;&amp;#x793A;&amp;#x51FA;&amp;#x6765;&amp;#x4E4B;&amp;#x540E;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;Rails 3&amp;#x5DF2;&amp;#x7ECF;&amp;#x81EA;&amp;#x52A8;&amp;#x8F6C;&amp;#x4E49;&amp;#x4E86;&amp;#x4E0A;&amp;#x8FF0;&amp;#x6211;&amp;#x4EEC;&amp;#x6240;&amp;#x63D0;&amp;#x4EA4;&amp;#x7684;&amp;#x5B57;&amp;#x6BB5;&amp;#x4E2D;&amp;#x7684;HTML&amp;#x6807;&amp;#x7B7E;&amp;#x3002;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x770B;&amp;#x770B;Rails&amp;#x662F;&amp;#x5982;&amp;#x4F55;&amp;#x505A;&amp;#x5230;&amp;#x7684;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img width="815" height="331" alt="The HTML comments are automatically escaped." src="/system/photos/339/original/E204I02.png"/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x663E;&amp;#x793A;&amp;#x6BCF;&amp;#x6761;&amp;#x8BC4;&amp;#x8BBA;&amp;#x7684;&amp;#x4EE3;&amp;#x7801;&amp;#x88AB;&amp;#x5305;&amp;#x542B;&amp;#x5728;&amp;#x4E00;&amp;#x4E2A;&amp;#x5C40;&amp;#x90E8;&amp;#x6A21;&amp;#x677F;&amp;#x4E2D;&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x67E5;&amp;#x770B;&amp;#x8FD9;&amp;#x4E9B;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x4F60;&amp;#x4F1A;&amp;#x53D1;&amp;#x73B0;&amp;#x5E76;&amp;#x6CA1;&amp;#x6709;&amp;#x4EFB;&amp;#x4F55;&amp;#x8F93;&amp;#x51FA;&amp;#x4F7F;&amp;#x7528;&amp;#x4E86;&lt;code&gt;h&lt;/code&gt;&amp;#x8F6C;&amp;#x4E49;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/comments/_comment.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;div class=&amp;quot;comment&amp;quot;&amp;gt;
  &amp;lt;strong&amp;gt;&amp;lt;%= link_to comment.name, comment.url %&amp;gt;&amp;lt;/strong&amp;gt;
  &amp;lt;p&amp;gt;&amp;lt;%= comment.content %&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&amp;#x5728;Rails2&amp;#x4E2D;&amp;#x8FD9;&amp;#x610F;&amp;#x5473;&amp;#x7740;&amp;#x5C06;&amp;#x4F1A;&amp;#x663E;&amp;#x793A;alert&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;&amp;#x6240;&amp;#x6709;&amp;#x5728;&amp;#x5C40;&amp;#x90E8;&amp;#x6A21;&amp;#x677F;&amp;#x4E2D;&amp;#x7684;&amp;#x8F93;&amp;#x51FA;&amp;#x90FD;&amp;#x4F1A;&amp;#x88AB;Rails 
3&amp;#x6B63;&amp;#x786E;&amp;#x7684;&amp;#x8F6C;&amp;#x4E49;&amp;#xFF0C;&amp;#x5373;&amp;#x4F7F;&amp;#x662F;&amp;#x901A;&amp;#x8FC7;&amp;#x4E86;&amp;#x8BF8;&amp;#x5982;link_to&amp;#x4E4B;&amp;#x7C7B;&amp;#x7684;helper&amp;#x65B9;&amp;#x6CD5;&amp;#x4E5F;&amp;#x662F;&amp;#x5982;&amp;#x6B64;&amp;#xFF0C;&amp;#x6240;&amp;#x4EE5;&amp;#x8FD9;&amp;#x91CC;&amp;#x4E0D;&amp;#x9700;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;h&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x60F3;&amp;#x60F3;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x6B63;&amp;#x5728;&amp;#x8F6C;&amp;#x6362;&amp;#x4E00;&amp;#x4E2A;Rails 2&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#xFF0C;&amp;#x5176;&amp;#x4E2D;&amp;#x7684;&amp;#x8F93;&amp;#x51FA;&amp;#x90FD;&amp;#x4F7F;&amp;#x7528;&amp;#x4E86;&lt;code&gt;h&lt;/code&gt;&amp;#x8FDB;&amp;#x884C;&amp;#x8F6C;&amp;#x4E49;&amp;#xFF0C;&amp;#x4F1A;&amp;#x53D1;&amp;#x751F;&amp;#x4EC0;&amp;#x4E48;&amp;#xFF1F;&amp;#x901A;&amp;#x8FC7;&amp;#x8F6C;&amp;#x4E49;&amp;#x524D;&amp;#x8FF0;&amp;#x5C40;&amp;#x90E8;&amp;#x6A21;&amp;#x677F;&amp;#x7684;&amp;#x8F93;&amp;#x51FA;&amp;#x5E76;&amp;#x91CD;&amp;#x8F7D;&amp;#x8BE5;&amp;#x9875;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x627E;&amp;#x51FA;&amp;#x7B54;&amp;#x6848;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/comments/_comment.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;div class=&amp;quot;comment&amp;quot;&amp;gt;
  &amp;lt;strong&amp;gt;&amp;lt;%= link_to h(comment.name), comment.url %&amp;gt;&amp;lt;/strong&amp;gt;
  &amp;lt;p&amp;gt;&amp;lt;%= h comment.content %&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x91CD;&amp;#x65B0;&amp;#x88C5;&amp;#x8F7D;&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;#x9875;&amp;#x9762;&amp;#x770B;&amp;#x8D77;&amp;#x6765;&amp;#x4E0E;&amp;#x4E0A;&amp;#x6B21;&amp;#x662F;&amp;#x4E00;&amp;#x6837;&amp;#x7684;&amp;#xFF0C;&amp;#x8F93;&amp;#x51FA;&amp;#x5E76;&amp;#x6CA1;&amp;#x6709;&amp;#x88AB;&amp;#x91CD;&amp;#x590D;&amp;#x8F6C;&amp;#x4E49;&amp;#x3002;Rails&amp;#x5F88;&amp;#x806A;&amp;#x660E;&amp;#xFF1B;&amp;#x5373;&amp;#x4FBF;&amp;#x6211;&amp;#x4EEC;&amp;#x4F7F;&amp;#x7528;&amp;#x4E86;&lt;code&gt;h&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#xFF0C;&amp;#x5B83;&amp;#x4E5F;&amp;#x53EA;&amp;#x4F1A;&amp;#x8FDB;&amp;#x884C;&amp;#x4E00;&amp;#x6B21;&amp;#x811A;&amp;#x672C;&amp;#x6807;&amp;#x7B7E;&amp;#x7684;&amp;#x8F6C;&amp;#x4E49;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x770B;&amp;#x8D77;&amp;#x6765;&amp;#x4F3C;&amp;#x4E4E;&lt;code&gt;h&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x5728;Rails 3&amp;#x4E2D;&amp;#x6CA1;&amp;#x4EC0;&amp;#x4E48;&amp;#x7528; 
&amp;#xFF0C;&amp;#x5176;&amp;#x5B9E;&amp;#x4E0D;&amp;#x7136;&amp;#x3002;&amp;#x5B83;&amp;#x4ECD;&amp;#x7136;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x4F5C;&amp;#x7528;&amp;#xFF0C;&amp;#x7A0D;&amp;#x540E;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x5411;&amp;#x4F60;&amp;#x6F14;&amp;#x793A;&amp;#x662F;&amp;#x4EC0;&amp;#x4E48;&amp;#x3002;&amp;#x5728;&amp;#x8FD9;&amp;#x4E4B;&amp;#x524D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x8981;&amp;#x5148;&amp;#x770B;&amp;#x4E00;&amp;#x4E2A;&amp;#x76F8;&amp;#x5173;&amp;#x7279;&amp;#x6027;&amp;#x3002;&amp;#x4E5F;&amp;#x8BB8;&amp;#x6709;&amp;#x65F6;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x60F3;&amp;#x663E;&amp;#x793A;&amp;#x539F;&amp;#x59CB;&amp;#x5185;&amp;#x5BB9;&amp;#x65F6;&amp;#xFF0C;&amp;#x80FD;&amp;#x81EA;&amp;#x52A8;&amp;#x8F6C;&amp;#x4E49;&amp;#x8F93;&amp;#x51FA;&amp;#x662F;&amp;#x5F88;&amp;#x597D;&amp;#x7684;&amp;#x3002;&amp;#x4F46;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x4FE1;&amp;#x4EFB;&amp;#x7528;&amp;#x6237;&amp;#x8F93;&amp;#x5165;&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#xFF0C;&amp;#x6BD4;&amp;#x5982;&amp;#x8BF4;&amp;#x4ED6;&amp;#x4EEC;&amp;#x662F;&amp;#x7BA1;&amp;#x7406;&amp;#x5458;&amp;#xFF0C;&amp;#x5E76;&amp;#x4E14;&amp;#x6211;&amp;#x4EEC;&amp;#x60F3;&amp;#x7CBE;&amp;#x786E;&amp;#x7684;&amp;#x663E;&amp;#x793A;&amp;#x4ED6;&amp;#x4EEC;&amp;#x8F93;&amp;#x5165;&amp;#x4E86;&amp;#x4EC0;&amp;#x4E48;&amp;#xFF0C;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;&amp;#x65B0;&amp;#x7684;&lt;code&gt;raw&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x6765;&amp;#x5B9E;&amp;#x73B0;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
&amp;lt;div class=&amp;quot;comment&amp;quot;&amp;gt;
  &amp;lt;strong&amp;gt;&amp;lt;%= link_to comment.name, comment.url %&amp;gt;&amp;lt;/strong&amp;gt;
  &amp;lt;p&amp;gt;&amp;lt;%= raw comment.content %&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x91CD;&amp;#x65B0;&amp;#x8F7D;&amp;#x5165;&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5728;&amp;#x8BC4;&amp;#x8BBA;&amp;#x680F;&amp;#x8F93;&amp;#x5165;&amp;#x7684;JavaScript&amp;#x5C31;&amp;#x4F1A;&amp;#x88AB;&amp;#x6267;&amp;#x884C;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img width="819" height="332" alt="Using the raw method means that the alert is shown." src="/system/photos/340/original/E204I03.png"/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x6240;&amp;#x4EE5;&amp;#xFF0C;&amp;#x5728;Rails3&amp;#x4E2D;&amp;#xFF0C;&amp;#x65E0;&amp;#x8BBA;&amp;#x4F55;&amp;#x65F6;&amp;#xFF0C;&amp;#x5F53;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0D;&amp;#x5E0C;&amp;#x671B;&amp;#x5185;&amp;#x5BB9;&amp;#x88AB;HTML&amp;#x8F6C;&amp;#x4E49;&amp;#x65F6;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;raw&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x3002;&amp;#x4F46;&amp;#x662F;&amp;#x8FD9;&amp;#x662F;&amp;#x5982;&amp;#x4F55;&amp;#x5B9E;&amp;#x73B0;&amp;#x7684;&amp;#xFF1F;&amp;#x5728;&amp;#x4F55;&amp;#x65F6;&amp;#x8F6C;&amp;#x4E49;&amp;#x5185;&amp;#x5BB9;&amp;#x548C;&amp;#x4F55;&amp;#x65F6;&amp;#x4E0D;&amp;#x8F6C;&amp;#x4E49;&amp;#x5185;&amp;#x5BB9;&amp;#x65B9;&amp;#x9762;&amp;#xFF0C;Rails3&amp;#x770B;&amp;#x8D77;&amp;#x6765;&amp;#x76F8;&amp;#x5F53;&amp;#x7684;&amp;#x806A;&amp;#x660E;&amp;#x3002;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x5C55;&amp;#x793A;&amp;#x7ED9;&amp;#x4F60;&amp;#x4EEC;&amp;#x770B;&amp;#x5B83;&amp;#x662F;&amp;#x600E;&amp;#x6837;&amp;#x5B9E;&amp;#x73B0;&amp;#x7684;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x5728;console&amp;#x4E2D;&amp;#x6F14;&amp;#x793A;&amp;#x8F6C;&amp;#x4E49;&amp;#x529F;&amp;#x80FD;&amp;#xFF0C;&amp;#x5728;Rails 3&amp;#x4E2D;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;&lt;code&gt;rails c&lt;/code&gt; &amp;#x547D;&amp;#x4EE4;&amp;#x6765;&amp;#x5524;&amp;#x51FA;&amp;#x5B83;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
$ rails c
Loading development environment (Rails 3.0.0.beta)
ruby-1.9.1-p378 &amp;gt;
&lt;/pre&gt;

&lt;p&gt;Rails 3 &amp;#x5F15;&amp;#x5165;&amp;#x4E86;HTML&amp;#x5B89;&amp;#x5168;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x7684;&amp;#x6982;&amp;#x5FF5;&amp;#x3002;&amp;#x8FD9;&amp;#x610F;&amp;#x5473;&amp;#x7740;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x8C03;&amp;#x7528;&amp;#x65B0;&amp;#x7684;&lt;code&gt;html_safe?&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x6765;&amp;#x68C0;&amp;#x67E5;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x4F5C;&amp;#x4E3A;HTML&amp;#x8F93;&amp;#x51FA;&amp;#x662F;&amp;#x5426;&amp;#x5B89;&amp;#x5168;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;&amp;gt; &amp;quot;foo&amp;quot;.html_safe?
 =&amp;gt; false 
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x8C03;&amp;#x7528;&lt;code&gt;html_safe&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x6765;&amp;#x6807;&amp;#x8BB0;&amp;#x4E00;&amp;#x4E2A;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x662F;HTML&amp;#x5B89;&amp;#x5168;&amp;#x7684;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;&amp;gt; safe = &amp;quot;safe&amp;quot;.html_safe
 =&amp;gt; &amp;quot;safe&amp;quot; 
&amp;gt; safe.html_safe?
 =&amp;gt; true 
&lt;/pre&gt; 

&lt;p&gt;&amp;#x8FD9;&amp;#x91CC;&amp;#x5B9E;&amp;#x9645;&amp;#x4E0A;&amp;#x6CA1;&amp;#x6709;&amp;#x8FDB;&amp;#x884C;&amp;#x8F6C;&amp;#x4E49;&amp;#x3002;&amp;#x6240;&amp;#x53D1;&amp;#x751F;&amp;#x7684;&amp;#x4E00;&amp;#x5207;&amp;#x53EA;&amp;#x662F;&amp;#x5BF9;&amp;#x4E00;&amp;#x4E2A;&amp;#x5B57;&amp;#x7B26;&amp;#x8BBE;&amp;#x7F6E;&amp;#x4E86;&amp;#x4E00;&amp;#x4E2A;&amp;#x5E03;&amp;#x5C14;&amp;#x5C5E;&amp;#x6027;&amp;#x6765;&amp;#x6307;&amp;#x793A;&amp;#x5B83;&amp;#x5728;&amp;#x8F93;&amp;#x51FA;&amp;#x524D;&amp;#x662F;&amp;#x5426;&amp;#x8981;&amp;#x88AB;&amp;#x8F6C;&amp;#x4E49;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x90A3;&amp;#x4E48;&amp;#x8FD9;&amp;#x662F;&amp;#x5982;&amp;#x4F55;&amp;#x5E94;&amp;#x7528;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x89C6;&amp;#x56FE;&amp;#x6A21;&amp;#x677F;&amp;#x4E2D;&amp;#x7684;&amp;#x5462;&amp;#x3002;Rails&amp;#x4F1A;&amp;#x68C0;&amp;#x67E5;&amp;#x6BCF;&amp;#x4E2A;&amp;#x8F93;&amp;#x51FA;&amp;#x770B;&amp;#x5B83;&amp;#x662F;&amp;#x5426;&amp;#x88AB;&amp;#x6807;&amp;#x8BB0;&amp;#x4E3A;HTML&amp;#x5B89;&amp;#x5168;&amp;#x7684;&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x4E0D;&amp;#x662F;&amp;#xFF0C;&amp;#x5728;&amp;#x8F93;&amp;#x51FA;&amp;#x5230;&amp;#x9875;&amp;#x9762;&amp;#x65F6;&amp;#x5B83;&amp;#x5C06;&amp;#x88AB;&amp;#x81EA;&amp;#x52A8;&amp;#x8F6C;&amp;#x4E49;&amp;#x3002;&amp;#x53CD;&amp;#x4E4B;&amp;#xFF0C;&amp;#x5B83;&amp;#x5C06;&amp;#x76F4;&amp;#x63A5;&amp;#x901A;&amp;#x8FC7;&amp;#x800C;&amp;#x4E0D;&amp;#x4F1A;&amp;#x88AB;&amp;#x8F6C;&amp;#x4E49;&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;h&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x6765;&amp;#x8F6C;&amp;#x4E49;&amp;#x4E00;&amp;#x4E2A;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#xFF0C;&amp;#x8BE5;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x5C06;&amp;#x4F1A;&amp;#x88AB;&amp;#x6267;&amp;#x884C;&amp;#x8F6C;&amp;#x4E49;&amp;#x52A8;&amp;#x4F5C;&amp;#xFF0C;&amp;#x540C;&amp;#x65F6;&amp;#x88AB;&amp;#x6807;&amp;#x8BB0;&amp;#x4E3A;HTML&amp;#x5B89;&amp;#x5168;&amp;#x7684;&amp;#x3002;&amp;#x8FD9;&amp;#x5C31;&amp;#x610F;&amp;#x5473;&amp;#x7740;Rails 3&amp;#x5C06;&amp;#x4F1A;&amp;#x8BA4;&amp;#x4E3A;&amp;#x8BE5;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x662F;&amp;#x5B89;&amp;#x5168;&amp;#x7684;&amp;#x800C;&amp;#x4E0D;&amp;#x4F1A;&amp;#x518D;&amp;#x6B21;&amp;#x8F6C;&amp;#x4E49;&amp;#x5B83;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x5728;&amp;#x4E00;&amp;#x4E2A;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x4E0A;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;raw&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x65F6;&amp;#xFF0C;&amp;#x5B83;&amp;#x5C06;&amp;#x88AB;&amp;#x6807;&amp;#x8BB0;&amp;#x4E3A;HTML&amp;#x5B89;&amp;#x5168;&amp;#x7684;&amp;#x4F46;&amp;#x4E0D;&amp;#x88AB;&amp;#x8F6C;&amp;#x4E49;&amp;#xFF0C;&amp;#x4ECE;&amp;#x800C;&amp;#x786E;&amp;#x4FDD;&amp;#x8BE5;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#x4F1A;&amp;#x4E0D;&amp;#x88AB;&amp;#x4FEE;&amp;#x6539;&amp;#x7684;&amp;#x4F20;&amp;#x9012;&amp;#x5230;&amp;#x8F93;&amp;#x51FA;&amp;#x3002;&lt;/p&gt; 

&lt;p&gt;&amp;#x5F53;&amp;#x4F60;&amp;#x4F7F;&amp;#x7528;helper&amp;#x65B9;&amp;#x6CD5;&amp;#x65F6;&amp;#xFF0C;&amp;#x7406;&amp;#x89E3;&amp;#x8FD9;&amp;#x4E9B;&amp;#x662F;&amp;#x975E;&amp;#x5E38;&amp;#x91CD;&amp;#x8981;&amp;#x7684;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x4F1A;&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x4E2A;&amp;#x540D;&amp;#x53EB;&lt;code&gt;strong&lt;/code&gt;&amp;#x7684;helper&amp;#x65B9;&amp;#x6CD5;&amp;#x6765;&amp;#x89E3;&amp;#x91CA;&amp;#x8FD9;&amp;#x4E2A;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E2A;&amp;#x65B9;&amp;#x6CD5;&amp;#x4F1A;&amp;#x5C06;&amp;#x4EFB;&amp;#x4F55;&amp;#x4F20;&amp;#x9012;&amp;#x7ED9;&amp;#x5B83;&amp;#x7684;&amp;#x4E1C;&amp;#x897F;&amp;#x5305;&amp;#x88C5;&amp;#x5728; &lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt;&amp;#x6807;&amp;#x7B7E;&amp;#x91CC;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x5728;&amp;#x6A21;&amp;#x677F;&amp;#x4E2D;&amp;#x50CF;&amp;#x8FD9;&amp;#x6837;&amp;#x4F7F;&amp;#x7528;&amp;#x5B83;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/comments/_comment.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;div class=&amp;quot;comment&amp;quot;&amp;gt;
  &amp;lt;%= strong link_to(comment.name, comment.url) %&amp;gt;
  &amp;lt;p&amp;gt;&amp;lt;%= raw comment.content %&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5728; &lt;code&gt;ApplicationHelper&lt;/code&gt; &amp;#x4E2D;&amp;#x521B;&amp;#x5EFA;&amp;#x4E86;&lt;code&gt;strong&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;:&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/helpers/application_helper.rb&lt;/p&gt;
&lt;pre class="ruby" &gt;
module ApplicationHelper
  def strong(content)
    &amp;quot;&amp;lt;strong&amp;gt;#{content}&amp;lt;/strong&amp;gt;&amp;quot;
  end
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x91CD;&amp;#x8F7D;&amp;#x9875;&amp;#x9762;&amp;#x65F6;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;#x5B83;&amp;#x5E76;&amp;#x6CA1;&amp;#x6709;&amp;#x6309;&amp;#x7167;&amp;#x6211;&amp;#x4EEC;&amp;#x9884;&amp;#x60F3;&amp;#x7684;&amp;#x65B9;&amp;#x5F0F;&amp;#x5DE5;&amp;#x4F5C;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img width="815" height="552" alt="The strong tag in our helper method is escaped." src="/system/photos/341/original/E204I04.png"/&gt;
&lt;/div&gt;

&lt;p&gt;Rails 3&amp;#x7684;&amp;#x81EA;&amp;#x52A8;&amp;#x8F6C;&amp;#x4E49;&amp;#x673A;&amp;#x5236;&amp;#x4F1A;&amp;#x8F6C;&amp;#x4E49;&amp;#x6389;&lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt;&amp;#x6807;&amp;#x7B7E;&amp;#xFF0C;&amp;#x8FD9;&amp;#x662F;&amp;#x56E0;&amp;#x4E3A;&amp;#x6211;&amp;#x4EEC;&amp;#x8F85;&amp;#x52A9;&amp;#x65B9;&amp;#x6CD5;&amp;#x6CA1;&amp;#x6709;&amp;#x521B;&amp;#x5EFA;&amp;#x4E00;&amp;#x4E2A;HTML&amp;#x5B89;&amp;#x5168;&amp;#x7684;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5F53;&amp;#x4F7F;&amp;#x7528;&amp;#x8FD4;&amp;#x56DE;&amp;#x7ED3;&amp;#x679C;&amp;#x662F;HTML&amp;#x4EE3;&amp;#x7801;&amp;#x7684;&amp;#x8F85;&amp;#x52A9;&amp;#x65B9;&amp;#x6CD5;&amp;#x65F6;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5FC5;&amp;#x987B;&amp;#x9075;&amp;#x5FAA;&amp;#x4E24;&amp;#x6761;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x539F;&amp;#x5219;&amp;#x3002;&amp;#x7B2C;&amp;#x4E00;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5FC5;&amp;#x987B;&amp;#x4FDD;&amp;#x8BC1;&amp;#x4EFB;&amp;#x4F55;&amp;#x8FD4;&amp;#x56DE;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x88AB;&amp;#x6807;&amp;#x8BB0;&amp;#x4E3A;HTML&amp;#x5B89;&amp;#x5168;&amp;#x7684;&amp;#x3002;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/helpers/application_helper.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
module ApplicationHelper
  def strong(content)
    &amp;quot;&amp;lt;strong&amp;gt;#{content}&amp;lt;/strong&amp;gt;&amp;quot;.html_safe
  end
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x4FEE;&amp;#x6B63;&amp;#x4E86; &lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt;&amp;#x6807;&amp;#x7B7E;&amp;#x88AB;&amp;#x8F6C;&amp;#x4E49;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x4F46;&amp;#x8FD9;&amp;#x4E48;&amp;#x505A;&amp;#x4F1A;&amp;#x5BFC;&amp;#x81F4;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6807;&amp;#x7B7E;&amp;#x5185;&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#x4E0D;&amp;#x88AB;&amp;#x8F6C;&amp;#x4E49;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x7528;&lt;code&gt;h&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x8F6C;&amp;#x4E49;&amp;#x8FD9;&amp;#x4E9B;&amp;#x5185;&amp;#x5BB9;&amp;#x6765;&amp;#x89E3;&amp;#x51B3;&amp;#x8FD9;&amp;#x4E2A;&amp;#x95EE;&amp;#x9898;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/helpers/application_helper.rb&lt;/p&gt;
&lt;pre class="ruby" style="display: none;"&gt;
module ApplicationHelper
  def strong(content)
    &amp;quot;&amp;lt;strong&amp;gt;#{h(content)}&amp;lt;/strong&amp;gt;&amp;quot;.html_safe
  end
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x6240;&amp;#x4EE5;&amp;#x53EA;&amp;#x8981;&amp;#x6211;&amp;#x4EEC;&amp;#x8BB0;&amp;#x5F97;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;h&lt;/code&gt;&amp;#x65B9;&amp;#x6CD5;&amp;#x6765;&amp;#x8F6C;&amp;#x4E49;&amp;#x6240;&amp;#x6709;&amp;#x7684;&amp;#x8F93;&amp;#x5165;&amp;#xFF0C;&amp;#x7136;&amp;#x540E;&amp;#x628A;&amp;#x7ED3;&amp;#x679C;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x6807;&amp;#x8BB0;&amp;#x4E3A;&lt;code&gt;html_safe&lt;/code&gt;&amp;#x7684;&amp;#xFF0C;&amp;#x5B83;&amp;#x5C31;&amp;#x4F1A;&amp;#x6B63;&amp;#x786E;&amp;#x7684;&amp;#x5448;&amp;#x73B0;&amp;#x3002;&amp;#x5982;&amp;#x679C;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x91CD;&amp;#x8F7D;&amp;#x8BC4;&amp;#x8BBA;&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&lt;code&gt;&amp;lt;strong&amp;gt;&lt;/code&gt;&amp;#x6807;&amp;#x7B7E;&amp;#x6CA1;&amp;#x6709;&amp;#x88AB;&amp;#x8F6C;&amp;#x4E49;&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;&amp;#x7B2C;&amp;#x4E8C;&amp;#x6761;&amp;#x8BC4;&amp;#x8BBA;&amp;#x4E2D;&amp;#x5305;&amp;#x542B;&amp;#x4E86;&amp;#x6709;&amp;#x6F5C;&amp;#x5728;&amp;#x5371;&amp;#x9669;&amp;#x7684;JavaScript&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#x88AB;&amp;#x8F6C;&amp;#x4E49;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img width="815" height="552" alt="The helper method is now escaped correctly." src="/system/photos/342/original/E204I05.png"/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x4EE5;&amp;#x4E0A;&amp;#x5C31;&amp;#x662F;&amp;#x672C;&amp;#x96C6;&amp;#x7684;&amp;#x4E3B;&amp;#x8981;&amp;#x5185;&amp;#x5BB9;&amp;#x3002;&amp;#x81EA;&amp;#x52A8;&amp;#x8F6C;&amp;#x4E49;&amp;#x673A;&amp;#x5236;&amp;#x662F;Rails 3&amp;#x89C6;&amp;#x56FE;&amp;#x4E2D;&amp;#x7684;&amp;#x4E00;&amp;#x4E2A;&amp;#x5E7F;&amp;#x53D7;&amp;#x6B22;&amp;#x8FCE;&amp;#x7684;&amp;#x589E;&amp;#x5F3A;&amp;#x3002;&amp;#x5B83;&amp;#x4F7F;&amp;#x5F97;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0D;&amp;#x518D;&amp;#x9700;&amp;#x8981;&amp;#x8BB0;&amp;#x4F4F;&amp;#x7528;&lt;code&gt;h&lt;/code&gt;h&amp;#x6765;&amp;#x8F6C;&amp;#x4E49;&amp;#x6BCF;&amp;#x4E00;&amp;#x5904;&amp;#x8F93;&amp;#x51FA;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x5C31;&amp;#x51CF;&amp;#x5C11;&amp;#x4E86;&amp;#x60A8;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x6210;&amp;#x4E3A;&amp;#x8DE8;&amp;#x7AD9;&amp;#x811A;&amp;#x672C;&amp;#x653B;&amp;#x51FB;&amp;#x7684;&amp;#x53D7;&amp;#x5BB3;&amp;#x8005;&amp;#x7684;&amp;#x673A;&amp;#x4F1A;&amp;#x3002;&lt;/p&gt;</description>
      <pubDate>Sat, 20 Mar 2010 23:03:46 +0000</pubDate>
      <guid>http://cn.asciicasts.com/episodes/204-xss-protection-in-rails-3</guid>
      <link>http://cn.asciicasts.com/episodes/204-xss-protection-in-rails-3</link>
    </item>
    <item>
      <title>Routing in Rails 3</title>
      <description>&lt;p&gt;&amp;#x8FD9;&amp;#x4E00;&amp;#x96C6;&amp;#x6211;&amp;#x4EEC;&amp;#x7EE7;&amp;#x7EED;&amp;#x7814;&amp;#x7A76;Rails&amp;#x7684;&amp;#x65B0;&amp;#x7279;&amp;#x6027;, &amp;#x8FD9;&amp;#x6B21;&amp;#x6211;&amp;#x4EEC;&amp;#x770B;&amp;#x4E00;&amp;#x4E0B;Rails 3&amp;#x7684;&amp;#x8DEF;&amp;#x7531;. Rails 3&amp;#x63D0;&amp;#x4F9B;&amp;#x4E86;&amp;#x4E00;&amp;#x4E9B;&amp;#x65B0;&amp;#x7684;API&amp;#x548C;&amp;#x65B0;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x6765;&amp;#x5B9A;&amp;#x4E49;&amp;#x8DEF;&amp;#x7531;. &amp;#x4E3A;&amp;#x4E86;&amp;#x66F4;&amp;#x597D;&amp;#x7684;&amp;#x6F14;&amp;#x793A;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5148;&amp;#x5EFA;&amp;#x7ACB;&amp;#x4E00;&amp;#x4E2A;detour&amp;#x5E94;&amp;#x7528;&amp;#x3002;&lt;/p&gt;
&lt;pre class="terminal"&gt;
rails detour
&lt;/pre&gt;
&lt;p&gt;&amp;#x5EFA;&amp;#x7ACB;&amp;#x597D;&amp;#x5E94;&amp;#x7528;&amp;#x4E4B;&amp;#x540E;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x6253;&amp;#x5F00;&lt;code&gt;config/routes.rb&lt;/code&gt;&amp;#x6587;&amp;#x4EF6;&amp;#x770B;&amp;#x4E00;&amp;#x4E0B;. &amp;#x9ED8;&amp;#x8BA4;&amp;#x7684;&amp;#x6587;&amp;#x4EF6;&amp;#x5305;&amp;#x542B;&amp;#x4E86;&amp;#x4E00;&amp;#x4E9B;&amp;#x6F14;&amp;#x793A;&amp;#x65B0;API&amp;#x7684;&amp;#x6587;&amp;#x6863;&amp;#x548C;&amp;#x4F8B;&amp;#x5B50;&amp;#xFF0C;&amp;#x5F53;&amp;#x4F60;&amp;#x6709;&amp;#x7A7A;&amp;#x7684;&amp;#x65F6;&amp;#x5019;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E9B;&amp;#x90FD;&amp;#x503C;&amp;#x5F97;&amp;#x4E00;&amp;#x770B;&amp;#x3002; &amp;#x6211;&amp;#x4EEC;&amp;#x5148;&amp;#x5220;&amp;#x6389;&amp;#x81EA;&amp;#x5E26;&amp;#x7684;&amp;#x6587;&amp;#x6863;&amp;#xFF0C;&amp;#x6362;&amp;#x4E0A;&amp;#x8001;&amp;#x7684;&amp;#x683C;&amp;#x5F0F;&amp;#xFF0C;&amp;#x518D;&amp;#x6765;&amp;#x5BF9;&amp;#x6BD4;&amp;#x4E00;&amp;#x4E0B;Rails 3&amp;#x65B0;&amp;#x7684;&amp;#x7528;&amp;#x6CD5;&amp;#x3002;&lt;/p&gt;
&lt;p class="codeFilePath"&gt;/config/routes.rb&lt;/p&gt;
&lt;pre class="ruby"&gt;
Detour::Application.routes.draw do |map|
  map.resources :products, :member =&amp;gt; { :detailed =&amp;gt; :get }

  map.resources :forums, :collection =&amp;gt; { :sortable =&amp;gt; :get, :sort =&amp;gt; :put } do |forums|
    forums.resources :topics
  end

  map.root :controller =&amp;gt; &amp;quot;home&amp;quot;, :action =&amp;gt; &amp;quot;index&amp;quot;

  map.about &amp;quot;/about&amp;quot;, :controller =&amp;gt; &amp;quot;info&amp;quot;, :action =&amp;gt; &amp;quot;about&amp;quot;
end
&lt;/pre&gt;
&lt;p class="title"&gt;&amp;#x4EE5;&amp;#x4E0A;&amp;#x662F;&amp;#x9700;&amp;#x8981;&amp;#x8F6C;&amp;#x5316;&amp;#x7684;&amp;#x8001;&amp;#x683C;&amp;#x5F0F;&amp;#x3002;&lt;/p&gt;
&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5148;&amp;#x4ECE;&amp;#x8FD9;&amp;#x4E00;&amp;#x4E2A;&amp;#x5F00;&amp;#x59CB;&amp;#xFF1A;&lt;/p&gt;
&lt;pre class="ruby"&gt;
map.resources :products, :member = { :detailed =&amp;gt; :get }
&lt;/pre&gt;
&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;&amp;#x8DEF;&amp;#x7531;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;product&amp;#x8D44;&amp;#x6E90;&amp;#xFF0C;&amp;#x548C;&amp;#x4E00;&amp;#x4E2A;&amp;#x53EB;&amp;#x505A;detailed&amp;#x7684;action,&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;Get&amp;#x65B9;&amp;#x6CD5;&amp;#x8BF7;&amp;#x6C42;&amp;#x3002;&lt;/p&gt;
&lt;p&gt;Rails 3&amp;#x7B2C;&amp;#x4E00;&amp;#x4E2A;&amp;#x503C;&amp;#x5F97;&amp;#x6CE8;&amp;#x610F;&amp;#x7684;&amp;#x6539;&amp;#x53D8;&amp;#xFF0C;&amp;#x5C31;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0D;&amp;#x518D;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;map&lt;/code&gt;&amp;#x5BF9;&amp;#x8C61;&amp;#xFF0C;&amp;#x53D6;&amp;#x800C;&amp;#x4EE3;&amp;#x4E4B;&amp;#x7684;&amp;#x662F;&amp;#x5728;&lt;code&gt;routes.draw&lt;/code&gt;&amp;#x5757;&amp;#x91CC;&amp;#x9762;&amp;#x76F4;&amp;#x63A5;&amp;#x8C03;&amp;#x7528;resources&amp;#x3002;resources&amp;#x5305;&amp;#x62EC;&amp;#x7684;&lt;code&gt;:member&lt;/code&gt;&amp;#x548C;&lt;code&gt;:collection&lt;/code&gt; &amp;#x52A8;&amp;#x4F5C;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&amp;#x4E00;&amp;#x4E2A;&amp;#x5757;&amp;#x6765;&amp;#x5B9A;&amp;#x4E49;&amp;#xFF0C; &amp;#x4E0A;&amp;#x8FF0;&amp;#x7684;&amp;#x8DEF;&amp;#x7531;&amp;#x53EF;&amp;#x4EE5;&amp;#x65B0;&amp;#x683C;&amp;#x5F0F;&amp;#x662F;&amp;#x8FD9;&amp;#x6837;:&lt;/p&gt;
&lt;pre class="ruby"&gt;
resources :products do
  get :detailed, :on =&amp;gt; :member
end
&lt;/pre&gt;
&lt;p&gt;&amp;#x4E0B;&amp;#x9762;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x6765;&amp;#x770B;&amp;#x4EE5;&amp;#x4E0B;&amp;#x66F4;&amp;#x590D;&amp;#x6742;&amp;#x7684;&amp;#x8DEF;&amp;#x7531;&amp;#xFF1A;&lt;/p&gt;
&lt;pre class="ruby"&gt;
map.resources :forums, :collection =&amp;gt; { :sortable =&amp;gt; :get, :sort =&amp;gt; :put } do |forums|
  forums.resources :topics
end
&lt;/pre&gt;
&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;&amp;#x8DEF;&amp;#x7531;&amp;#xFF0C;&amp;#x5728;forum&amp;#x8D44;&amp;#x6E90;&amp;#x91CC;&amp;#x9762;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x6709;&amp;#x4E24;&amp;#x4E2A;&amp;#x989D;&amp;#x5916;&amp;#x7684;:collection&amp;#x52A8;&amp;#x4F5C;&amp;#xFF0C;&amp;#x8FD8;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x5D4C;&amp;#x5957;&amp;#x7684;Topic&amp;#x8D44;&amp;#x6E90;&amp;#x3002;&amp;#x65B0;&amp;#x7684;API&amp;#x4E2D;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x5199;&amp;#x6210;&amp;#x8FD9;&amp;#x6837;&amp;#xFF1A;&lt;/p&gt;
&lt;pre class="ruby"&gt;
resources :forums do
  collection do
    get :sortable
    put :sort
  end
  resources :topics
end
&lt;/pre&gt;
&lt;p&gt;&amp;#x4EE5;&amp;#x4E0A;&amp;#x4EE3;&amp;#x7801;&amp;#x5728;&amp;#x4E00;&amp;#x6B21;&amp;#x5C55;&amp;#x793A;&amp;#x4E86;&amp;#x53D6;&amp;#x6D88;&lt;code&gt;map.resources&lt;/code&gt;,&amp;#x76F4;&amp;#x63A5;&amp;#x7528;&lt;code&gt;resources&lt;/code&gt;&amp;#x5757;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x6709;&amp;#x4E24;&amp;#x4E2A;collection&amp;#x52A8;&amp;#x4F5C;&amp;#xFF0C;&amp;#x5C3D;&amp;#x7BA1;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x50CF;&amp;#x7B2C;&amp;#x4E00;&amp;#x4E2A;&amp;#x4F8B;&amp;#x5B50;&amp;#x4E2D;detailed&amp;#x52A8;&amp;#x4F5C;&amp;#x4E00;&amp;#x6837;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;:on&lt;/code&gt;&amp;#xFF0C;&amp;#x4F46;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD9;&amp;#x91CC;&amp;#x7528;collection&amp;#x5757;&amp;#x8FBE;&amp;#x5230;&amp;#x4E86;&amp;#x540C;&amp;#x6837;&amp;#x7684;&amp;#x6548;&amp;#x679C; (member&amp;#x52A8;&amp;#x4F5C;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;member&lt;/code&gt;&amp;#x5757;)&amp;#x3002;&amp;#x4EFB;&amp;#x4F55;&amp;#x5728;&amp;#x8FD9;&amp;#x4E2A;&amp;#x5757;&amp;#x91CC;&amp;#x9762;&amp;#x5B9A;&amp;#x4E49;&amp;#x7684;&amp;#x8DEF;&amp;#x7531;&amp;#xFF0C;&amp;#x90FD;&amp;#x4F1A;&amp;#x4F5C;&amp;#x7528;&amp;#x5728;forums&amp;#x7684;&amp;#x96C6;&amp;#x5408;&amp;#x4E0A;&amp;#x3002;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x4F8B;&amp;#x5B50;&amp;#x4E2D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x5B9A;&amp;#x4E49;&amp;#x4E86;&amp;#x4E24;&amp;#x4E2A;&amp;#xFF0C;&amp;#x4E00;&amp;#x4E2A;&amp;#x662F;GET&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;sortable&amp;#x548C;PUT&amp;#x65B9;&amp;#x6CD5;&amp;#x7684;sort&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x81F3;&amp;#x4E8E;&amp;#x5D4C;&amp;#x5957;&amp;#x7684;topics&amp;#x8D44;&amp;#x6E90;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x5728;forums&amp;#x7684;&amp;#x5757;&amp;#x91CC;&amp;#x518D;&amp;#x6B21;&amp;#x8C03;&amp;#x7528;&lt;code&gt;resources&lt;/code&gt;&amp;#xFF0C;&amp;#x8D77;&amp;#x5230;&amp;#x5D4C;&amp;#x5957;&amp;#x7684;&amp;#x6548;&amp;#x679C;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x4E0B;&amp;#x4E00;&amp;#x4E2A;&amp;#x8DEF;&amp;#x7531;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x770B;&amp;#x4E00;&amp;#x4E0B;&amp;#x600E;&amp;#x4E48;&amp;#x5B9A;&amp;#x4E49;root&amp;#x7684;&amp;#x63A7;&amp;#x5236;&amp;#x5668;&amp;#x548C;&amp;#x52A8;&amp;#x4F5C;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
map.root :controller =&amp;gt; &amp;quot;home&amp;quot;, :action =&amp;gt; &amp;quot;index&amp;quot;
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x91CC;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x76F4;&amp;#x63A5;&amp;#x8C03;&amp;#x7528;&lt;code&gt;root&lt;/code&gt;&amp;#xFF0C;&amp;#x7528;&lt;code&gt;:to&lt;/code&gt;&amp;#x6765;&amp;#x5B9A;&amp;#x4E49;&amp;#x8981;&amp;#x8F6C;&amp;#x5230;&amp;#x7684;&amp;#x52A8;&amp;#x4F5C;&amp;#xFF0C;&amp;#x63A7;&amp;#x5236;&amp;#x5668;&amp;#x8DDF;&amp;#x52A8;&amp;#x4F5C;&amp;#x4E4B;&amp;#x95F4;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;#&amp;#x6765;&amp;#x533A;&amp;#x9694;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
root :to =&amp;gt; &amp;quot;home#index&amp;quot;
&lt;/pre&gt;

&lt;p&gt;&amp;#x7528;&amp;#x4E00;&amp;#x4E2A;#&amp;#x5206;&amp;#x9694;&amp;#x7684;&amp;#x5B57;&amp;#x7B26;&amp;#x4E32;&amp;#x6765;&amp;#x5B9A;&amp;#x4E49;&amp;#x63A7;&amp;#x5236;&amp;#x5668;&amp;#x8DDF;&amp;#x52A8;&amp;#x4F5C;&amp;#xFF0C;&amp;#x662F;Rails 3&amp;#x7684;&amp;#x65B0;&amp;#x7279;&amp;#x6027;&amp;#x4E4B;&amp;#x4E00;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;&amp;#x7C7B;&amp;#x4F3C;&amp;#x7684;&amp;#x683C;&amp;#x5F0F;&amp;#x6765;&amp;#x5B9A;&amp;#x4E49;named&amp;#x8DEF;&amp;#x7531;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
map.about &amp;quot;/about&amp;quot;, :controller =&amp;gt; &amp;quot;info&amp;quot;, :action =&amp;gt; &amp;quot;about&amp;quot;
&lt;/pre&gt;

&lt;p&gt;Rails 3&amp;#x4E2D;&amp;#x6539;&amp;#x5199;&amp;#x6210;&amp;#x8FD9;&amp;#x6837;&amp;#xFF1A;&lt;/p&gt;

&lt;pre class="ruby"&gt;
match &amp;quot;/about&amp;quot; =&amp;gt; &amp;quot;info#about&amp;quot;, :as =&amp;gt; :about
&lt;/pre&gt;

&lt;p&gt;&amp;#x6CA1;&amp;#x6709;:as&amp;#x53C2;&amp;#x6570;&amp;#xFF0C;&amp;#x8FD9;&amp;#x4E2A;&amp;#x8DEF;&amp;#x7531;&amp;#x5C31;&amp;#x662F;&amp;#x5355;&amp;#x7EAF;&amp;#x7684;&amp;#x8F6C;&amp;#x5411;&amp;#8221;/about&amp;#8221;, &amp;#x52A0;&amp;#x4E86;&lt;code&gt;:as&lt;/code&gt; &amp;#x4E4B;&amp;#x540E;&amp;#xFF0C;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x91CC;&amp;#x9762;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F7F;&amp;#x7528;&lt;code&gt;about_path&lt;/code&gt;&amp;#x6216;&amp;#x8005;&lt;code&gt;about_url&lt;/code&gt;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;&amp;#x65B0;&amp;#x529F;&amp;#x80FD;&lt;/h3&gt;

&lt;p&gt;&amp;#x4ECE;&amp;#x4E0A;&amp;#x9762;&amp;#x7684;&amp;#x4F8B;&amp;#x5B50;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x51FA;&amp;#xFF0C;&amp;#x53EA;&amp;#x9700;&amp;#x8981;&amp;#x5FAE;&amp;#x5C0F;&amp;#x7684;&amp;#x6539;&amp;#x52A8;&amp;#xFF0C;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x4ECE;&amp;#x8001;&amp;#x7684;API&amp;#x8F6C;&amp;#x5316;&amp;#x5230;&amp;#x65B0;&amp;#x7684;API&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;&amp;#x771F;&amp;#x6B63;&amp;#x5438;&amp;#x5F15;&amp;#x4EBA;&amp;#x7684;&amp;#x662F;&amp;#x65B0;API&amp;#x63D0;&amp;#x4F9B;&amp;#x7684;&amp;#x4E00;&amp;#x4E9B;&amp;#x65B0;&amp;#x529F;&amp;#x80FD;&amp;#xFF0C;&amp;#x4E0B;&amp;#x9762;&amp;#x6211;&amp;#x4EEC;&amp;#x6765;&amp;#x770B;&amp;#x5176;&amp;#x4E2D;&amp;#x7684;&amp;#x4E00;&amp;#x90E8;&amp;#x5206;&amp;#x3002;&lt;/p&gt;

&lt;h4&gt;&amp;#x53EF;&amp;#x9009;&amp;#x53C2;&amp;#x6570;&lt;/h4&gt;

&lt;p&gt;&amp;#x524D;&amp;#x4E00;&amp;#x4E2A;&amp;#x7248;&amp;#x672C;&amp;#x5C31;&amp;#x5DF2;&amp;#x7ECF;&amp;#x6709;&amp;#x5BF9;&amp;#x53EF;&amp;#x9009;&amp;#x53C2;&amp;#x6570;&amp;#x7684;&amp;#x652F;&amp;#x6301;&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;&amp;#x7528;&amp;#x6CD5;&amp;#x6BD4;&amp;#x8F83;&amp;#x9EBB;&amp;#x70E6;&amp;#xFF0C;&amp;#x4E0B;&amp;#x9762;&amp;#x6211;&amp;#x4EEC;&amp;#x6765;&amp;#x770B;&amp;#x4E00;&amp;#x4E0B;Rails 3&amp;#x4E2D;&amp;#x600E;&amp;#x4E48;&amp;#x4F7F;&amp;#x7528;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5EFA;&amp;#x7ACB;&amp;#x4E00;&amp;#x4E2A;&lt;code&gt;info&lt;/code&gt;&amp;#x63A7;&amp;#x5236;&amp;#x5668;&amp;#x548C;&lt;code&gt;about&lt;/code&gt;&amp;#x52A8;&amp;#x4F5C;&amp;#x6765;&amp;#x5C55;&amp;#x793A;&amp;#x53EF;&amp;#x9009;&amp;#x53C2;&amp;#x6570;&amp;#x3002;Rails 3&amp;#x652F;&amp;#x6301;&amp;#x7528;&lt;code&gt;rails g&lt;/code&gt;&amp;#x6765;&amp;#x4F5C;&amp;#x4E3A;&lt;code&gt;rails generate&lt;/code&gt;&amp;#x7684;&amp;#x5FEB;&amp;#x6377;&amp;#x65B9;&amp;#x5F0F;&amp;#x3002;&lt;/p&gt;

&lt;pre class="terminal"&gt;
rails g controller info about
&lt;/pre&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;&lt;code&gt;rails s&lt;/code&gt;&amp;#x5FEB;&amp;#x6377;&amp;#x65B9;&amp;#x5F0F;&amp;#x6765;&amp;#x542F;&amp;#x52A8;&amp;#x670D;&amp;#x52A1;&amp;#x5668;&lt;/p&gt;
&lt;pre class="terminal"&gt;rails s&lt;/pre&gt;
&lt;p&gt;&amp;#x73B0;&amp;#x5728;&amp;#x6211;&amp;#x4EEC;&amp;#x6253;&amp;#x5F00;http://localhost:3000/about, &amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x8F6C;&amp;#x5230;&amp;#x4E4B;&amp;#x524D;&amp;#x5DF2;&amp;#x7ECF;&amp;#x5728;&amp;#x8DEF;&amp;#x7531;&amp;#x914D;&amp;#x5236;&amp;#x6587;&amp;#x4EF6;&amp;#x91CC;&amp;#x9762;&amp;#x5B9A;&amp;#x4E49;&amp;#x7684;info#about&amp;#x52A8;&amp;#x4F5C;&amp;#x3002;&lt;/p&gt;  
&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/332/original/E203I01.png" width="797" height="280" alt="The about action."/&gt;
&lt;/div&gt;  &lt;p&gt;&amp;#x5047;&amp;#x8BBE;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0B;&amp;#x4E00;&amp;#x6B65;&amp;#x60F3;&amp;#x8981;&amp;#x6DFB;&amp;#x52A0;&amp;#x5BF9;pdf&amp;#x683C;&amp;#x5F0F;&amp;#x7684;&amp;#x652F;&amp;#x6301;&amp;#xFF0C;&amp;#x53EF;&amp;#x662F;&amp;#x73B0;&amp;#x5728;&amp;#x6253;&amp;#x5F00;&lt;a href="http://localhost:3000/about.pdf"&gt;http://localhost:3000/about.pdf&lt;/a&gt;&amp;#x7684;&amp;#x8BDD;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;#x4E00;&amp;#x4E2A;&amp;#x8DEF;&amp;#x7531;&amp;#x9519;&amp;#x8BEF;&amp;#xFF0C;&amp;#x63D0;&amp;#x793A;&amp;#x6CA1;&amp;#x6709;&amp;#x5B9A;&amp;#x4E49;&amp;#x8DEF;&amp;#x7531;&amp;#x3002;&lt;/p&gt;
&lt;p&gt;&amp;#x5728;&amp;#x8DEF;&amp;#x7531;&amp;#x6587;&amp;#x4EF6;&amp;#x91CC;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E2A;format&amp;#x53C2;&amp;#x6570;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
match &amp;quot;/about.:format&amp;quot; =&amp;gt; &amp;quot;info#about&amp;quot;, :as =&amp;gt; :about
&lt;/pre&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x5237;&amp;#x65B0;&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6B21;&amp;#x4F1A;&amp;#x5F97;&amp;#x5230;&amp;#x5E94;&amp;#x7528;&amp;#x627E;&amp;#x4E0D;&amp;#x5230;template&amp;#x9519;&amp;#x8BEF;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/333/original/E203I02.png" width="797" height="280" alt="The PDF route is now matched."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x5DF2;&amp;#x7ECF;&amp;#x89E3;&amp;#x51B3;&amp;#x4E86;&amp;#x4E4B;&amp;#x524D;&amp;#x7684;&amp;#x95EE;&amp;#x9898;&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;format&amp;#x53C2;&amp;#x6570;&amp;#x4E0D;&amp;#x662F;&amp;#x53EF;&amp;#x9009;&amp;#x53C2;&amp;#x6570;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x8FD4;&amp;#x56DE;&amp;#x4E4B;&amp;#x524D;&amp;#x6CA1;&amp;#x6709;.pdf&amp;#x540E;&amp;#x7F00;&amp;#x7684;&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x9047;&amp;#x5230;&amp;#x8DEF;&amp;#x7531;&amp;#x9519;&amp;#x8BEF;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x505A;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x6539;&amp;#x52A8;&amp;#xFF0C;&amp;#x53EA;&amp;#x9700;&amp;#x7528;&amp;#x62EC;&amp;#x53F7;&amp;#x62EC;&amp;#x8D77;&amp;#x6765;&amp;#xFF0C;&amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x8BA9;format&amp;#x53D8;&amp;#x4E3A;&amp;#x53EF;&amp;#x9009;&amp;#x53C2;&amp;#x6570;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
match &amp;quot;/about(.:format)&amp;quot; =&amp;gt; &amp;quot;info#about&amp;quot;, :as =&amp;gt; :about
&lt;/pre&gt;

&lt;p&gt;&amp;#x7136;&amp;#x540E;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x6B63;&amp;#x5E38;&amp;#x7684;&amp;#x6253;&amp;#x5F00;&lt;a href="http://localhost:3000/about"&gt;http://localhost:3000/about&lt;/a&gt; &amp;#x6216;&amp;#x8005; &lt;a href="http://localhost:3000/about.pdf"&gt;http://localhost:3000/about.pdf&lt;/a&gt;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x4E0B;&amp;#x9762;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x6765;&amp;#x770B;&amp;#x4E00;&amp;#x4E0B;&amp;#x600E;&amp;#x4E48;&amp;#x4F7F;&amp;#x7528;&amp;#x66F4;&amp;#x4E3A;&amp;#x590D;&amp;#x6742;&amp;#x7684;&amp;#x53EF;&amp;#x9009;&amp;#x53C2;&amp;#x6570;&amp;#xFF0C;&amp;#x4F8B;&amp;#x5982;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x73B0;&amp;#x5728;&amp;#x6709;&amp;#x4E00;&amp;#x4E2A;&amp;#x535A;&amp;#x5BA2;&amp;#x5E94;&amp;#x7528;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x60F3;&amp;#x8981;&amp;#x5728;&amp;#x7F51;&amp;#x5740;&amp;#x4E2D;&amp;#xFF0C;&amp;#x7528;&amp;#x53EF;&amp;#x9009;&amp;#x7684;&amp;#x5E74;&amp;#x6708;&amp;#x65E5;&amp;#x6765;&amp;#x8FC7;&amp;#x6EE4;&amp;#x4E00;&amp;#x6BB5;&amp;#x7279;&amp;#x5B9A;&amp;#x65F6;&amp;#x95F4;&amp;#x7684;&amp;#x8D34;&amp;#x5B50;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;&amp;#x4E0B;&amp;#x9762;&amp;#x7684;&amp;#x8DEF;&amp;#x7531;&amp;#x8FBE;&amp;#x5230;&amp;#x8FD9;&amp;#x4E2A;&amp;#x6548;&amp;#x679C;&amp;#xFF0C;&amp;#x4E3B;&amp;#x4E49;&amp;#x62EC;&amp;#x53F7;&amp;#x53EF;&amp;#x4EE5;&amp;#x5D4C;&amp;#x5957;&amp;#x8D77;&amp;#x6765;&amp;#x5B9A;&amp;#x4E49;&amp;#x591A;&amp;#x4E2A;&amp;#x53EF;&amp;#x9009;&amp;#x53C2;&amp;#x6570;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
match &amp;quot;/:year(/:month(/:day))&amp;quot; =&amp;gt; &amp;quot;info#about&amp;quot;
&lt;/pre&gt;

&lt;p&gt;&amp;#x5728;view&amp;#x4E2D;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E9B;&amp;#x8C03;&amp;#x8BD5;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;&amp;#x6765;&amp;#x68C0;&amp;#x67E5;&amp;#x4F20;&amp;#x5165;&amp;#x7684;&amp;#x53C2;&amp;#x6570;&amp;#xFF1A;&lt;/p&gt;

&lt;p class="codeFilePath"&gt;/app/views/info/about.html.erb&lt;/p&gt;
&lt;pre class="ruby"&gt;
&amp;lt;h1&amp;gt;Info#about&amp;lt;/h1&amp;gt;
&amp;lt;p&amp;gt;Find me in app/views/info/about.html.erb&amp;lt;/p&amp;gt;
&amp;lt;%= debug params %&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&amp;#x4E0B;&amp;#x9762;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F20;&amp;#x5165;year&amp;#x53C2;&amp;#x6570;&amp;#xFF0C;about&amp;#x52A8;&amp;#x4F5C;&amp;#x4F1A;&amp;#x6536;&amp;#x5230;&amp;#x6211;&amp;#x4EEC;&amp;#x4F20;&amp;#x5165;&amp;#x7684;&amp;#x503C;&amp;#xFF0C;month&amp;#x548C;day&amp;#x53C2;&amp;#x6570;&amp;#x4E5F;&amp;#x662F;&amp;#x5982;&amp;#x6B64;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/334/original/E203I03.png" width="798" height="280" alt="The date paramters are passed to the route."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x8FD9;&amp;#x4E2A;&amp;#x8DEF;&amp;#x7531;&amp;#x662F;&amp;#x6BD4;&amp;#x8F83;&amp;#x5BBD;&amp;#x6CDB;&amp;#x7684;&amp;#xFF0C;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F20;&amp;#x5165;&amp;#xFF0C;&amp;#x4F8B;&amp;#x5982;http://localhost:3000/foo/bar&amp;#xFF0C;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#x53C2;&amp;#x6570;&amp;#x4E5F;&amp;#x4F1A;&amp;#x88AB;&amp;#x4F20;&amp;#x5230;&amp;#x63A7;&amp;#x5236;&amp;#x5668;&amp;#xFF0C;&amp;#x5F88;&amp;#x663E;&amp;#x7136;&amp;#xFF0C;&amp;#x60F3;&amp;#x8981;&amp;#x7B26;&amp;#x5408;&amp;#x65E5;&amp;#x671F;&amp;#x89C4;&amp;#x8303;&amp;#x7684;&amp;#x53C2;&amp;#x6570;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;constraints&amp;#x6765;&amp;#x8FBE;&amp;#x5230;&amp;#x8FD9;&amp;#x6837;&amp;#x7684;&amp;#x76EE;&amp;#x7684;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;Constraints&lt;/h3&gt;
&lt;p&gt;Constraints &amp;#x5C31;&amp;#x662F;Rails 2&amp;#x4E2D;&amp;#x7684;requirements.  &lt;code&gt;:constraints&lt;/code&gt;&amp;#x53EF;&amp;#x4EE5;&amp;#x4F20;&amp;#x5165;&amp;#x4E00;&amp;#x4E2A;hash&amp;#x6765;&amp;#x9650;&amp;#x5B9A;&amp;#x5339;&amp;#x914D;&amp;#x3002;&amp;#x4EE5;&amp;#x4E0B;&amp;#x7684;&amp;#x4F8B;&amp;#x5B50;&amp;#x7528;&amp;#x56DB;&amp;#x4E2A;&amp;#x6570;&amp;#x5B57;&amp;#x6765;&amp;#x9650;&amp;#x5B9A;&amp;#x5E74;&amp;#xFF0C;&amp;#x4E24;&amp;#x4E2A;&amp;#x6570;&amp;#x5B57;&amp;#x6765;&amp;#x9650;&amp;#x5B9A;&amp;#x6708;&amp;#x548C;&amp;#x65E5;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
match &amp;quot;/:year(/:month(/:day))&amp;quot; =&amp;gt; &amp;quot;info#about&amp;quot;, :constraints =&amp;gt; { :year =&amp;gt; /\d{4}/, :month =&amp;gt; /\d{2}/, :day =&amp;gt; /\d{2}/ }
&lt;/pre&gt;

&lt;p&gt;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E86;&amp;#x8FD9;&amp;#x4E2A;constraint&amp;#x4E4B;&amp;#x540E;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x518D;&amp;#x770B;&amp;#x4E00;&amp;#x4E0B;/foo/bar&amp;#x8DEF;&amp;#x5F84;&amp;#xFF0C;&amp;#x8FD9;&amp;#x6B21;&amp;#x6211;&amp;#x4EEC;&amp;#x5F97;&amp;#x5230;&amp;#x4E86;&amp;#x4E00;&amp;#x4E2A;&amp;#x65E0;&amp;#x6CD5;&amp;#x5339;&amp;#x914D;&amp;#x7684;&amp;#x9519;&amp;#x8BEF;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/335/original/E203I04.png" width="798" height="280" alt="The route now doesn't match unless the parameters match a date."/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x73B0;&amp;#x5728;&amp;#x505A;&amp;#x7684;&amp;#xFF0C;Rails 2&amp;#x7684;requirements&amp;#x90FD;&amp;#x53EF;&amp;#x4EE5;&amp;#x505A;&amp;#x5230;&amp;#x3002;&amp;#x4F46;&amp;#x662F;Rails 3&amp;#x7684;Constraint&amp;#x66F4;&amp;#x52A0;&amp;#x5F3A;&amp;#x5927;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x4F8B;&amp;#x5982;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;user_agent&amp;#x53C2;&amp;#x6570;&amp;#x6765;&amp;#x9650;&amp;#x5236;&amp;#x4E00;&amp;#x4E9B;&amp;#x6D4F;&amp;#x89C8;&amp;#x5668;&amp;#x7684;&amp;#x8BBF;&amp;#x95EE;&amp;#xFF0C;&amp;#x4EE5;Firefox&amp;#x4E3A;&amp;#x4F8B;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
match &amp;quot;/secret&amp;quot; =&amp;gt; &amp;quot;info#about&amp;quot;, :constraints =&amp;gt; { :user_agent =&amp;gt; /Firefox/ }
&lt;/pre&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x7528;Safari, Chrome&amp;#x6216;&amp;#x8005;Opera&amp;#x8BBF;&amp;#x95EE;&amp;#x9875;&amp;#x9762;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x770B;&amp;#x5230;&amp;#x4E00;&amp;#x4E2A;&amp;#x5339;&amp;#x914D;&amp;#x9519;&amp;#x8BEF;&amp;#x3002;&amp;#x4F46;&amp;#x662F;Firefox&amp;#x53EF;&amp;#x4EE5;&amp;#x6B63;&amp;#x5E38;&amp;#x6D4F;&amp;#x89C8;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/336/original/E203I05.png" width="973" height="287" alt="The route only matches when viewed in Firefox"/&gt;
&lt;/div&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x6DFB;&amp;#x52A0;&amp;#x4E00;&amp;#x4E9B;&amp;#x66F4;&amp;#x6709;&amp;#x7528;&amp;#x5904;&amp;#x7684;constraint&amp;#x6BD4;&amp;#x5982;&amp;#x4E3B;&amp;#x673A;&amp;#x540D;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
match &amp;quot;/secret&amp;quot; =&amp;gt; &amp;quot;info#about&amp;quot;, :constraints =&amp;gt; { :host =&amp;gt; /localhost/ }
&lt;/pre&gt;

&lt;p&gt;&amp;#x4F7F;&amp;#x7528;&amp;#x8FD9;&amp;#x4E2A;constraint&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x901A;&amp;#x8FC7;&lt;a href="http://localhost:3000/secret"&gt;http://localhost:3000/secret&lt;/a&gt;&amp;#x6765;&amp;#x6D4F;&amp;#x89C8;&amp;#x7F51;&amp;#x9875;&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;&amp;#x7528;ip&amp;#x5730;&amp;#x5740;&amp;#x5C06;&amp;#x4F1A;&amp;#x8FD4;&amp;#x56DE;&amp;#x9519;&amp;#x8BEF;( &lt;a href="http://127.0.0.1/secret"&gt;http://127.0.0.1/secret&lt;/a&gt; )&amp;#xFF0C;&amp;#x5176;&amp;#x5B9E;&amp;#x4E24;&amp;#x4E2A;&amp;#x5730;&amp;#x5740;&amp;#x672C;&amp;#x8D28;&amp;#x4E0A;&amp;#x90FD;&amp;#x662F;&amp;#x4E00;&amp;#x6837;&amp;#x7684;&amp;#x3002;&amp;#x8FD9;&amp;#x4E2A;&amp;#x529F;&amp;#x80FD;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;&amp;#x6765;&amp;#x9650;&amp;#x5236;&amp;#x67D0;&amp;#x4E9B;&amp;#x4E8C;&amp;#x7EA7;&amp;#x57DF;&amp;#x540D;&amp;#x7684;&amp;#x8BBF;&amp;#x95EE;&amp;#xFF0C;&amp;#x76EE;&amp;#x524D;&amp;#x8FD9;&amp;#x4E00;&amp;#x90E8;&amp;#x5206;&amp;#x8FD8;&amp;#x5728;&amp;#x5F00;&amp;#x53D1;&amp;#x4E2D;&amp;#xFF0C;&amp;#x5728;&amp;#x4EE5;&amp;#x540E;&amp;#x7684;&amp;#x7248;&amp;#x672C;&amp;#x4E2D;&amp;#xFF0C;constraint&amp;#x53EF;&amp;#x4EE5;&amp;#x4F20;&amp;#x5165;:subdomain&amp;#x53C2;&amp;#x6570;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x6211;&amp;#x4EEC;&amp;#x6709;&amp;#x591A;&amp;#x4E2A;&amp;#x8DEF;&amp;#x7531;&amp;#x540C;&amp;#x65F6;&amp;#x4F7F;&amp;#x7528;&amp;#x4E00;&amp;#x4E2A;constraint&amp;#xFF0C;&amp;#x4F1A;&amp;#x9020;&amp;#x6210;&amp;#x5F88;&amp;#x591A;&amp;#x4EE3;&amp;#x7801;&amp;#x7684;&amp;#x91CD;&amp;#x590D;&amp;#x3002;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;constraints&amp;#x65B9;&amp;#x6CD5;&amp;#x628A;&amp;#x8FD9;&amp;#x4E9B;&amp;#x8DEF;&amp;#x7531;&amp;#x653E;&amp;#x5230;&amp;#x4E00;&amp;#x4E2A;&amp;#x5757;&amp;#x4E2D;&amp;#x6765;&amp;#x964D;&amp;#x4F4E;&amp;#x4EE3;&amp;#x7801;&amp;#x91CD;&amp;#x590D;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
constraints :host =&amp;gt; /localhost/ do
  match &amp;quot;/secret&amp;quot; =&amp;gt; &amp;quot;info#about&amp;quot;
  match &amp;quot;/topsecret&amp;quot; =&amp;gt; &amp;quot;info#about&amp;quot;
end
&lt;/pre&gt;

&lt;p&gt;&amp;#x8FD8;&amp;#x6709;&amp;#x5F88;&amp;#x591A;constraint&amp;#x7684;&amp;#x9AD8;&amp;#x7EA7;&amp;#x529F;&amp;#x80FD;&amp;#xFF0C;&amp;#x5C31;&amp;#x4E0D;&amp;#x5728;&amp;#x8FD9;&amp;#x91CC;&amp;#x4E00;&amp;#x4E00;&amp;#x8D58;&amp;#x8FF0;&amp;#x4E86;&amp;#x3002;&lt;/p&gt;

&lt;h3&gt;Rack&amp;#x8DEF;&amp;#x7531;&lt;/h3&gt;

&lt;p&gt;&amp;#x56E0;&amp;#x4E3A;&amp;#x65F6;&amp;#x95F4;&amp;#x7684;&amp;#x5173;&amp;#x7CFB;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x6CA1;&amp;#x529E;&amp;#x6CD5;&amp;#x6DB5;&amp;#x76D6;&amp;#x6240;&amp;#x6709;Rails3&amp;#x7684;&amp;#x8DEF;&amp;#x7531;&amp;#x6539;&amp;#x8FDB;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x5728;&amp;#x672A;&amp;#x6765;&amp;#x7684;&amp;#x89C6;&amp;#x9891;&amp;#x91CC;&amp;#x6162;&amp;#x6162;&amp;#x63A5;&amp;#x89E6;&amp;#x3002; &amp;#x6211;&amp;#x4ECA;&amp;#x5929;&amp;#x60F3;&amp;#x4ECB;&amp;#x7ECD;&amp;#x7684;&amp;#x6700;&amp;#x540E;&amp;#x4E00;&amp;#x4E2A;&amp;#x529F;&amp;#x80FD;&amp;#xFF0C;&amp;#x662F;Rails 3&amp;#x8DEF;&amp;#x7531;&amp;#x4E0E;Rack&amp;#x7684;&amp;#x96C6;&amp;#x6210;&amp;#x3002;
&amp;#x901A;&amp;#x5E38;&amp;#x6211;&amp;#x4EEC;&amp;#x5C06;&amp;#x5730;&amp;#x5740;&amp;#x5339;&amp;#x914D;&amp;#x5230;&amp;#x4E00;&amp;#x4E2A;&amp;#x63A7;&amp;#x5236;&amp;#x5668;&amp;#x548C;&amp;#x52A8;&amp;#x4F5C;&amp;#xFF0C;&amp;#x4F46;&amp;#x662F;&amp;#x6211;&amp;#x4EEC;&amp;#x4E5F;&amp;#x53EF;&amp;#x4EE5;&amp;#x5339;&amp;#x914D;&amp;#x7ED9;&amp;#x4E00;&amp;#x4E2A;Rack&amp;#x5E94;&amp;#x7528;&amp;#xFF0C;&amp;#x8FD9;&amp;#x662F;&amp;#x4E00;&amp;#x4E2A;&amp;#x975E;&amp;#x5E38;&amp;#x5F3A;&amp;#x5927;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#xFF0C;&amp;#x6211;&amp;#x7528;&amp;#x4E00;&amp;#x4E2A;&amp;#x7B80;&amp;#x5355;&amp;#x7684;Rack&amp;#x5E94;&amp;#x7528;&amp;#x6765;&amp;#x5C55;&amp;#x793A;&amp;#x8FD9;&amp;#x4E2A;&amp;#x529F;&amp;#x80FD;&amp;#x3002;&lt;/p&gt;

&lt;pre class="ruby"&gt;
match &amp;quot;/hello&amp;quot; =&amp;gt; proc { |env| [200, {}, &amp;quot;Hello Rack!&amp;quot;] }
&lt;/pre&gt;

&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x4E0D;&amp;#x662F;&amp;#x5F88;&amp;#x719F;&amp;#x6089;Rack&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x4E00;&amp;#x4E0B;&amp;#x7B2C;&lt;a href="http://asciicasts.com/episodes/151-rack-middleware"&gt;151&lt;/a&gt;&amp;#x96C6;&amp;#x89C6;&amp;#x9891;&amp;#xFF0C;&amp;#x6211;&amp;#x4EEC;&amp;#x4E0A;&amp;#x9762;&amp;#x4EE3;&amp;#x7801;&amp;#x5C31;&amp;#x662F;&amp;#x8FD4;&amp;#x56DE;HTTP&amp;#x6210;&amp;#x529F;&amp;#x4EE3;&amp;#x7801;&amp;#xFF0C;&amp;#x548C;&amp;#x5F88;&amp;#x7B80;&amp;#x5355;&amp;#x7684;&amp;#x5185;&amp;#x5BB9;&amp;#x3002;&lt;/p&gt;

&lt;p&gt;&amp;#x6211;&amp;#x4EEC;&amp;#x8BBF;&amp;#x95EE; /hello &amp;#x5C31;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x5230;&amp;ldquo;Hello Rack!&amp;#xFF0C;&amp;#x4EE5;&amp;#x6B64;&amp;#x6211;&amp;#x4EEC;&amp;#x53EF;&amp;#x4EE5;&amp;#x770B;&amp;#x51FA;Rack&amp;#x5DE5;&amp;#x4F5C;&amp;#x6B63;&amp;#x5E38;&amp;#x5E76;&amp;#x54CD;&amp;#x5E94;&amp;#x8BF7;&amp;#x6C42;.&amp;#x4F60;&amp;#x53EF;&amp;#x4EE5;&amp;#x7528;&amp;#x8FD9;&amp;#x4E2A;&amp;#x5F3A;&amp;#x5927;&amp;#x7684;&amp;#x529F;&amp;#x80FD;&amp;#x5C06;&amp;#x8DEF;&amp;#x7531;&amp;#x8F6C;&amp;#x5230;&amp;#x4E0D;&amp;#x540C;&amp;#x7684;&amp;#x5E94;&amp;#x7528;&amp;#x3002;&amp;#x6BD4;&amp;#x5982;&amp;#x53EF;&amp;#x4EE5;&amp;#x5C06;&amp;#x8DEF;&amp;#x7531;&amp;#x5339;&amp;#x914D;&amp;#x5230;Sinatra&amp;#x5E94;&amp;#x7528;&amp;#x3002;&lt;/p&gt;

&lt;div class="imageWrapper"&gt;
  &lt;img src="/system/photos/337/original/E203I06.png" width="799" height="280" alt="The response is seen from the Rack app."/&gt;
&lt;/div&gt;

&lt;p&gt;Rails 3&amp;#x7684;&amp;#x8DEF;&amp;#x7531;&amp;#x529F;&amp;#x80FD;&amp;#x5E26;&amp;#x6765;&amp;#x4E86;&amp;#x5F88;&amp;#x591A;&amp;#x4EE4;&amp;#x4EBA;&amp;#x632F;&amp;#x594B;&amp;#x7684;&amp;#x53EF;&amp;#x80FD;&amp;#x6027;&amp;#xFF0C;&amp;#x5C3D;&amp;#x7BA1;&amp;#x4ECA;&amp;#x5929;&amp;#x6211;&amp;#x4EEC;&amp;#x53EA;&amp;#x662F;&amp;#x5927;&amp;#x4F53;&amp;#x5730;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E86;&amp;#x4E00;&amp;#x4E0B;&amp;#xFF0C;&amp;#x4EE5;&amp;#x540E;&amp;#x6211;&amp;#x4EEC;&amp;#x4F1A;&amp;#x8BE6;&amp;#x7EC6;&amp;#x7684;&amp;#x4ECB;&amp;#x7ECD;&amp;#x4E00;&amp;#x90E8;&amp;#x5206;&amp;#x5177;&amp;#x4F53;&amp;#x7528;&amp;#x6CD5;&amp;#x3002;&lt;/p&gt;
&lt;p&gt;&amp;#x5982;&amp;#x679C;&amp;#x4F60;&amp;#x9700;&amp;#x8981;&amp;#x66F4;&amp;#x591A;Rails 3&amp;#x7684;&amp;#x8DEF;&amp;#x7531;&amp;#x4FE1;&amp;#x606F;&amp;#xFF0C;&amp;#x53EF;&amp;#x4EE5;&amp;#x53C2;&amp;#x8003;&lt;a href="http://yehudakatz.com/2009/12/26/the-rails-3-router-rack-it-up/"&gt;Yehuda Katz&lt;/a&gt;&amp;#x7684;&amp;#x535A;&amp;#x5BA2;&amp;#x548C;&lt;a href="http://guides.rails.info/routing.html"&gt;RailsGuides&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Sat, 06 Mar 2010 16:18:05 +0000</pubDate>
      <guid>http://cn.asciicasts.com/episodes/203-routing-in-rails-3</guid>
      <link>http://cn.asciicasts.com/episodes/203-routing-in-rails-3</link>
    </item>
  </channel>
</rss>

