﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-子在川上曰-随笔分类-Rails&amp;Ruby</title><link>http://www.blogjava.net/chengang/category/20990.html</link><description>　　　　逝者如斯夫不舍昼夜</description><language>zh-cn</language><lastBuildDate>Tue, 06 Nov 2007 15:40:49 GMT</lastBuildDate><pubDate>Tue, 06 Nov 2007 15:40:49 GMT</pubDate><ttl>60</ttl><item><title>VIM的常用插件+配置文件+资料</title><link>http://www.blogjava.net/chengang/archive/2007/10/18/153970.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Thu, 18 Oct 2007 10:15:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/10/18/153970.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/153970.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/10/18/153970.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/153970.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/153970.html</trackback:ping><description><![CDATA[用VIM来开发rails也挺不错的，自完代码完成，代码颜色等功能都有。也算netbean、eclipse之外的轻量级选择吧。<br />
我把VIM的常用插件，自己用的配置文件，收罗的一些资料一并打包了，省得初用VIM的人找来找去浪费时间。<br /><br /><a title="http://www.blogjava.net/Files/chengang/myvim.zip" href="/Files/chengang/myvim.zip">http://www.blogjava.net/Files/chengang/myvim.zip</a><br /><br /><br /><br />在ubuntu7.10中的gvim出现乱码，这时需要在主目录下的“.vimrc”文件中加上定义字体的一句。我用的是“微软雅黑”字体所以此句为：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">set guifont</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">YaHei\ Consolas\ Hybrid\ </span><span style="color: rgb(0, 0, 0);">10</span></div>注意：字体名中有空格的，用斜杠分开，而且斜杠后面一定要有一个空格。10是字体大小，前面有一个空格。<br /><img src ="http://www.blogjava.net/chengang/aggbug/153970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-10-18 18:15 <a href="http://www.blogjava.net/chengang/archive/2007/10/18/153970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>个性化页面布局的设计思考与Rails初步实现</title><link>http://www.blogjava.net/chengang/archive/2007/10/11/151900.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Wed, 10 Oct 2007 16:00:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/10/11/151900.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/151900.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/10/11/151900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/151900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/151900.html</trackback:ping><description><![CDATA[象博客，以及google的iGoogle，都可以个性化页面布局---对页面模块增删改，以及调整位置。这种效果是如何实现的呢？在我的项目中也面临到
这个需求。我最初的解决方法是创建几个典型的rhtml布局组合。但这远远不够，而且不灵活，在形式上也不统一。于是我再次修改了设计，之后似乎可以基本
解决这个问题了。希望感兴趣的朋友一起来讨论。<br /><br />
这个设计其实很简单，就是“引擎+配置“--主体页面只定义一个rthml，可以把它看做页面引擎，然后用一个配置文件指定了页面所应具有的模块和数据。
页面模块就象一个个装有数据的盒子，通过“页面引擎 +
配置文件”把这些盒子组合起来，象搭积木一样。页面引擎是各用户共用的，配置文件是各用户独有的，这样一装配起来，就形成了用户的个性化页面。<br /><br />
剩下的重点就是怎么定义配置文件。首先是要划清配置文件的责任界线----它只负责定义盒子里的数据，还有盒子的嵌套关系，而大小和位置等布局方面则全部交给CSS去负责。<br /><br />
上面是初步想法，下面看看具体实现，代码仅供参考<br /><br />
以下是某个用户的配置文件（我没用XML，而是用YAML）。board_1是指ID=1这个栏目所用的配置定义。topContent是一个<div>&lt;div&gt;的id值，我把每个栏目的页面分成<span>topContent顶、sideContent边（左或右由CSS决定）、</span><span>primaryContent
主要、bottomContent底。topic是指添加一个模块（盒子），显示一个主题内容。和topic类似是还有显示图像的image、显示主题列
表的topics、显示分类列表的categories等等等等。它们各有不同的属性值，比如topic模块，它需要定指它的主题id，以及它所用的
view(topics/_show_hot.rhtml  or  topics/_show.rhtml等等)。<br /><br />（虽然这个配置文件抽象得还不够，但这样子已经可以解决我的需要了，那</span><span></span><span>就</span><span>暂时</span><span>这样先了。）<br /><br /></span>template.yml<br /><div class="dp-highlighter"><div class="bar"> </div><ol start="1" class="dp-j"><li class="alt"><span><span>board_2:  </span></span></li><li class=""><span>  </span></li><li class="alt"><span>board_1:  </span></li><li class=""><span>- topContent:  </span></li><li class="alt"><span>  - topic:  </span></li><li class=""><span>      topic_id: <span class="number">7</span><span>  </span></span></li><li class="alt"><span>      view: topics/show_hot  </span></li><li class=""><span>- sideContent:  </span></li><li class="alt"><span>  - image:  </span></li><li class=""><span>      url: /images/news.jpg  </span></li><li class="alt"><span>  - categories:  </span></li><li class=""><span>      board: <span class="number">5</span><span>  </span></span></li><li class="alt"><span>      view: tree  </span></li><li class=""><span>  - topics:  </span></li><li class="alt"><span>      board: <span class="number">5</span><span>  </span></span></li><li class=""><span>      per_page: <span class="number">4</span><span>  </span></span></li><li class="alt"><span>      view: index_simple  </span></li><li class=""><span>  - topics:  </span></li><li class="alt"><span>      board: <span class="number">6</span><span>  </span></span></li><li class=""><span>- primaryContent:  </span></li><li class="alt"><span>  - topics:  </span></li><li class=""><span>      board: <span class="number">4</span><span>  </span></span></li><li class="alt"><span>      view: index  </span></li><li class=""><span>  - topic:  </span></li><li class="alt"><span>      topic_id: <span class="number">7</span><span>  </span></span></li><li class=""><span>      view: util/box  </span></li><li class="alt"><span>  </span></li><li class=""><span>board_3:  </span></li></ol></div><br />
然后在controller里把配置文件读入，再转化成模型类。我把各个界面模块看做一个个盒子Box<br />
这是它的顶级Box<br /><div class="code_title">ruby 代码</div><div class="dp-highlighter"><div class="bar"> </div><ol start="1" class="dp-rb"><li class="alt"><span><span class="keyword">class</span><span> Box  </span></span></li><li class=""><span>  attr_accessor <span class="symbol">:html_id</span><span>, </span><span class="symbol">:view</span><span>, </span><span class="symbol">:boxes</span><span>  </span></span></li><li class="alt"><span>  <span class="keyword">def</span><span> initialize</span><span><br /></span></span></li><li class=""><span>    <span class="variable">@boxes</span><span>=[]  </span></span></li><li class="alt"><span>  <span class="keyword">end</span><span>  </span></span></li><li class=""><span><span class="keyword">end</span><span>  </span></span></li></ol></div><br />
这是topic模块的<br /><div class="code_title">ruby 代码</div><div class="dp-highlighter"><div class="bar"> </div><ol start="1" class="dp-rb"><li class="alt"><span><span class="keyword">class</span><span> TopicBox &lt; Box  </span></span></li><li class=""><span>  attr_accessor <span class="symbol">:topic_id</span><span>  </span></span></li><li class="alt"><span><span class="keyword">end</span><span>  </span></span></li></ol></div><br />
这是Image模块的<br /><div class="code_title">ruby 代码</div><div class="dp-highlighter"><div class="bar"> </div><ol start="1" class="dp-rb"><li class="alt"><span><span class="keyword">class</span><span> ImageBox &lt; Box  </span></span></li><li class=""><span>  attr_accessor <span class="symbol">:url</span><span>  </span></span></li><li class=""><span><span class="keyword">end</span><span>  </span>   <br /></span></li></ol></div><br />
.....等 等， 其他的Box子类大同小异<br /><br />
然后在一个controller里把这些配置信息转成Box模型类<br /><div class="code_title">ruby 代码</div><div class="dp-highlighter"><div class="bar"> </div><ol start="1" class="dp-rb"><li class="alt"><span><span>templates =  YAML::load(File.read("public/uploads/#{user_id}/config/template.yml"))</span><span><br /></span></span></li><li class=""><span>template = templates.find{<span class="variable">|o</span><span>| o[0]==</span><span class="string">"board_#{@board.id}"</span><span> }  </span></span></li><li class="alt"><span>args = template[1]  </span></li><li class=""><span>  </span></li><li class="alt"><span><span class="variable">@boxes</span><span> = []  </span></span></li><li class=""><span>args.<span class="keyword">each</span><span> </span><span class="keyword">do</span><span> </span><span class="variable">|arg1_hash</span><span>|  </span></span></li><li class="alt"><span>  arg1_hash.<span class="keyword">each</span><span> </span><span class="keyword">do</span><span> </span><span class="variable">|key1</span><span>, value1|  </span></span></li><li class=""><span>    board_box = BoardBox.<span class="keyword">new</span><span>  </span></span></li><li class="alt"><span>    board_box.html_id = key1  </span></li><li class=""><span>    <span class="variable">@boxes</span><span> &lt;&lt; board_box  </span></span></li><li class="alt"><span>    value1.<span class="keyword">each</span><span> </span><span class="keyword">do</span><span> </span><span class="variable">|arg2_hash</span><span>|  </span></span></li><li class=""><span>      arg2_hash.<span class="keyword">each</span><span> </span><span class="keyword">do</span><span> </span><span class="variable">|key2</span><span>, value2|  </span></span></li><li class="alt"><span>        <span class="keyword">case</span><span> key2  </span></span></li><li class=""><span>        <span class="keyword">when</span><span> 'topics'  </span></span></li><li class="alt"><span>          box = TopicsBox.<span class="keyword">new</span><span>  </span></span></li><li class=""><span>          box.board_id = value2['board']  </span></li><li class="alt"><span>          box.per_page = value2['per_page']|<span class="variable">|2</span><span>  </span></span></li><li class=""><span>          box.view = value2['view']||'index_simple'  </span></li><li class="alt"><span>          board_box.boxes &lt;&lt; box   </span></li><li class=""><span>        <span class="keyword">when</span><span> 'categories'  </span></span></li><li class="alt"><span>          box = CategoriesBox.<span class="keyword">new</span><span>  </span></span></li><li class=""><span>          box.board_id = value2['board']  </span></li><li class="alt"><span>          box.view = value2['view']||'list'  </span></li><li class=""><span>          board_box.boxes &lt;&lt; box   </span></li><li class="alt"><span>        <span class="keyword">when</span><span> 'image'  </span></span></li><li class=""><span>          box = ImageBox.<span class="keyword">new</span><span>  </span></span></li><li class="alt"><span>          box.url = value2['url']  </span></li><li class=""><span>          board_box.boxes &lt;&lt; box   </span></li><li class="alt"><span>        <span class="keyword">when</span><span> 'topic'  </span></span></li><li class=""><span>          box = TopicBox.<span class="keyword">new</span><span>  </span></span></li><li class="alt"><span>          box.topic_id = value2['topic_id']  </span></li><li class=""><span>          box.view = value2['view']||'util/box'  </span></li><li class="alt"><span>          board_box.boxes &lt;&lt; box   </span></li><li class=""><span>        <span class="keyword">end</span><span>  </span></span></li><li class="alt"><span>      <span class="keyword">end</span><span>  </span></span></li><li class=""><span>    <span class="keyword">end</span><span>  </span></span></li><li class="alt"><span>  <span class="keyword">end</span><span>  </span></span></li><li class="alt"><span><span class="keyword">end</span><span>  </span><br /></span></li></ol></div><br />
最后是它页面引擎（逻辑代码和页面代码混在一起，比较丑陋）
<div class="code_title">ruby 代码</div><div class="dp-highlighter"><div class="bar"> </div><ol start="1" class="dp-rb"><li class="alt"><span><span>&lt;% </span><span class="variable">@boxes</span><span>.</span><span class="keyword">each</span><span> </span><span class="keyword">do</span><span> </span><span class="variable">|box1</span><span>| %&gt;  </span></span></li><li class=""><span><div id><span class="string">"&lt;%=box1.html_id%&gt;"</span><span>&gt;  </span></div id>/span&gt;</span></li><li class="alt"><span>  &lt;% box1.boxes.<span class="keyword">each</span><span> </span><span class="keyword">do</span><span> </span><span class="variable">|box2</span><span>|  </span></span></li><li class=""><span>       p1 box2.<span class="keyword">class</span><span>.to_s  </span></span></li><li class="alt"><span>  </span></li><li class=""><span>      <span class="keyword">case</span><span> box2.</span><span class="keyword">class</span><span>.to_s  </span></span></li><li class="alt"><span>      <span class="keyword">when</span><span> 'TopicsBox'  </span></span></li><li class=""><span>        board_id = box2.board_id  </span></li><li class="alt"><span>        <span class="keyword">if</span><span> board_id  </span></span></li><li class=""><span>          board = Board.find(board_id)  </span></li><li class="alt"><span>          topics = Topic.by_board_id(board_id, <span class="symbol">:per_page</span><span> =&gt; box2.per_page)   </span></span></li><li class=""><span>          %&gt;  </span></li><li class="alt"><span>          &lt;%= render(<span class="symbol">:partial</span><span> =&gt; </span><span class="string">"topics/#{box2.view}"</span><span>, </span><span class="symbol">:locals</span><span> =&gt; {</span><span class="symbol">:title</span><span> =&gt;board.title, </span><span class="symbol">:topics</span><span> =&gt; topics })%&gt;  </span></span></li><li class=""><span>        &lt;%<span class="keyword">end</span><span>  </span></span></li><li class="alt"><span>      <span class="keyword">when</span><span> 'CategoriesBox'  </span></span></li><li class=""><span>        board_id = box2.board_id  </span></li><li class="alt"><span>        <span class="keyword">if</span><span> board_id  </span></span></li><li class=""><span>          board = Board.find(board_id)  </span></li><li class="alt"><span>          categories = board.categories  </span></li><li class=""><span>          %&gt;  </span></li><li class="alt"><span>          &lt;%= render <span class="symbol">:partial</span><span> =&gt; </span><span class="string">"categories/#{box2.view}"</span><span>, </span><span class="symbol">:locals</span><span> =&gt; {</span><span class="symbol">:board</span><span> =&gt;board, </span><span class="symbol">:categories</span><span> =&gt; categories } %&gt;  </span></span></li><li class=""><span>        &lt;%<span class="keyword">end</span><span>%&gt;  </span></span></li><li class="alt"><span>      &lt;%<span class="keyword">when</span><span> 'ImageBox'%&gt;  </span></span></li><li class=""><span>        &lt;%= box_tag <span class="symbol">:header</span><span>=&gt;</span><span class="keyword">false</span><span>%&gt;  </span></span></li><li class="alt"><span>          &lt;%=image_tag(box2.url, <span class="symbol">:border</span><span> =&gt; 0) %&gt;  </span></span></li><li class=""><span>        &lt;%= end_box_tag %&gt;  </span></li><li class="alt"><span>      &lt;%<span class="keyword">when</span><span> 'TopicBox'  </span></span></li><li class=""><span>        topic = Topic.find(box2.topic_id) %&gt;  </span></li><li class="alt"><span>        &lt;%=render(<span class="symbol">:partial</span><span> =&gt; </span><span class="string">"#{box2.view}"</span><span>, </span><span class="symbol">:locals</span><span> =&gt; {</span><span class="symbol">:title</span><span> =&gt;topic.title, </span><span class="symbol">:content</span><span> =&gt; topic.content, </span><span class="symbol">:topic</span><span> =&gt; topic })%&gt;  </span></span></li><li class=""><span>      &lt;%<span class="keyword">end</span><span>  </span></span></li><li class=""><span>  <span class="keyword">end</span><span>%&gt;  </span></span></li></ol></div>  <br /></div><br />
这样，以后想在页面上增加删除什么模块，修改配置文件就行了。当然给用户用，还必须得用AJAX来写个GUI界面，总不能让用户手工去改配置文件吧。<br /><img src ="http://www.blogjava.net/chengang/aggbug/151900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-10-11 00:00 <a href="http://www.blogjava.net/chengang/archive/2007/10/11/151900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>抽取FCKEditor的浏览图片功能</title><link>http://www.blogjava.net/chengang/archive/2007/09/26/148412.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Wed, 26 Sep 2007 10:49:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/09/26/148412.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/148412.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/09/26/148412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/148412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/148412.html</trackback:ping><description><![CDATA[过去，我们上传图片，一般都是一个文本框加一个“浏览”按钮，通过浏览按钮选取本地的图片，然后在提交表单后的逻辑中将图片上传至服务器。现在，我们已经把FCKEditor应用在了我们的系统里，而FCKEditor中带了有了图片上传和浏览功能。所以我就想让这个“浏览”按钮不是从本地选取图片，而是从FCKEditor传到服务器上的图片中来选举。也就是把FCKEditor的“浏览”按钮，抽取出来。<br /><div align="center">文/陈刚 <a title="http://www.blogjava.net/chengang/archive/2007/09/26/148114.html" href="/chengang/archive/2007/09/26/148114.html">www.chengang.com.cn</a> 转载请保留出处<br /></div>在阅读FCKEditor的源码之后，做如下处理。<br /><br />1. 新增两个javascript函数。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">var</span><span style="color: rgb(0, 0, 0);"> currentImageTextID;<br /><br /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">FCKEditor的文件浏览窗关闭后，会调用此函数，并把所选图片的url传入。</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);"> SetUrl(url){<br />  document.getElementById(currentImageTextID).value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">url;<br />}<br /><br /></span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">imageTextID: 图片文本框的ID值</span><span style="color: rgb(0, 128, 0);"><br />//</span><span style="color: rgb(0, 128, 0);">uploadPath: 服务器的图片目录</span><span style="color: rgb(0, 128, 0);"><br />//</span><span style="color: rgb(0, 128, 0);">type: 浏览类型，值可为Image/Flash/File/Media，如果为空字串，则表示浏览所有类型的文件</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 255);">function</span><span style="color: rgb(0, 0, 0);"> OpenImageBrowser(imageTextID, uploadPath, type ) {<br />  currentImageTextID </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> imageTextID;<br />  window.open('</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">javascripts</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">fckeditor</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">editor</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">filemanager</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">browser</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 255);">default</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">browser.html</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);">uploaded</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">uploadPath</span><span style="color: rgb(0, 0, 0);"> +</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">Type</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">type</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">Connector</span><span style="color: rgb(0, 0, 0);">=/</span><span style="color: rgb(0, 0, 0);">fckeditor</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">command','Browse</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">Upload Images','toolbar</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">no,status</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">no, resizable</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">yes,dependent</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">yes, scrollbars</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">yes,width</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">600</span><span style="color: rgb(0, 0, 0);">,height</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">400</span><span style="color: rgb(0, 0, 0);">')<br />}<br /></span></div><br />2.在View中这样使用<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);">标志图片:</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"><br />&lt;</span><span style="color: rgb(0, 0, 0);">input id</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">topic_image</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> name</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">topic[image]</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> size</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">30</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> type</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">text</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;<br />&lt;</span><span style="color: rgb(0, 0, 0);">input value</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">浏览服务器</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> onclick</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">OpenImageBrowser('topic_image', '/uploads/s&lt;%= params[:user_id]%&gt;', 'Image')</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> type</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">button</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"><br /></span></div><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><br /><br /><img src ="http://www.blogjava.net/chengang/aggbug/148412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-09-26 18:49 <a href="http://www.blogjava.net/chengang/archive/2007/09/26/148412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让Rails版的FCKEditor支持动态设置上传目录</title><link>http://www.blogjava.net/chengang/archive/2007/09/26/148114.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Wed, 26 Sep 2007 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/09/26/148114.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/148114.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/09/26/148114.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/148114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/148114.html</trackback:ping><description><![CDATA[一个多用户的系统，上传图像文件等，希望不同用户的图像上传到它专有的目录里。我最初查到在PHP版的FCKEditor是通过设置$Config('UserFilesPath')来实现，但Rails版的FCKEditor没有此项设置（搜索UserFilesPath关键字后做出此判断）。接着，我查看了FCKEditor关键的fckeditor_controller.rb的源代码，似乎它并不支持此项设置。再看javaeye是怎么用FCKEditor的，发现它放弃了FCKEditor的上传功能。google了半天，除了那些转来转去的相同内容的帖子之外（搞不懂有了google之后，怎么还会有人费劲去转帖别人的文章），一点营养也没有。在JavaEye发了个求助帖，没人理 :-( 。 传说中高手云集的JavaEye，其Rails版块真是冷清，给人阴飕飕的感觉。没办法，自己改源代码吧。<br /><div align="center">文/陈刚 <a title="http://www.blogjava.net/chengang/archive/2007/09/26/148114.html" href="/chengang/archive/2007/09/26/148114.html">www.chengang.com.cn</a> 转载请保留出处<br /></div>1.修改fckeditor_controller.rb，把它那几个private方法修改如下：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">  <br />  </span><span style="color: rgb(0, 0, 255);">private</span><span style="color: rgb(0, 0, 0);"><br />  def current_directory_path<br />    base_dir </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{RAILS_ROOT}/public</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br /><br />    #TODO 在创建用户时，就建立好目录。这时可以去掉这部份代码，提高运行效率。<br />    (</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{params[:uploaded]||UPLOADED}/#{params[:Type]}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">).split(</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">).each </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">s</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />    next </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> s</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">''</span><span style="color: rgb(0, 0, 0);"><br />        base_dir </span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> s<br />        Dir.mkdir(base_dir,</span><span style="color: rgb(0, 0, 0);">0775</span><span style="color: rgb(0, 0, 0);">) unless File.exists</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);">(base_dir)<br />    end<br />    <br />    check_path(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{base_dir}#{params[:CurrentFolder]}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />  end<br />  <br />  def upload_directory_path<br />    uploaded </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> @request.relative_url_root.to_s</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{params[:uploaded]||UPLOADED}/#{params[:Type]}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />    </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{uploaded}#{params[:CurrentFolder]}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />  end<br />  <br />  def check_file(file)<br />    # check that the file is a tempfile object<br />    unless </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{file.class}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">Tempfile</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{file.class}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">StringIO</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"><br />      @errorNumber </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">403</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);"> Exception.</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"><br />    end<br />    file<br />  end<br />  <br />  def check_path(path)<br />    exp_path </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> File.expand_path path<br />    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> exp_path </span><span style="color: rgb(0, 0, 0);">!~</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">r[</span><span style="color: rgb(0, 0, 0);">^</span><span style="color: rgb(0, 0, 0);">#{File.expand_path(RAILS_ROOT)}</span><span style="color: rgb(0, 0, 0);">/</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">#{params[:uploaded]</span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);">UPLOADED}]<br />      @errorNumber </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">403</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 255);">throw</span><span style="color: rgb(0, 0, 0);"> Exception.</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);"><br />    end<br />    path<br />  end</span></div><br />另外，它前面的常量UPLOADED_ROOT也没用了，可以删掉。<br /><br /><br />2. 在上面的代码中<span style="color: rgb(0, 0, 0);">params[:uploaded]是关键，它就是我们动态定义的上传目录。该值来自于FCKEditor的一些html页面，它是通过get参数传入的。修改browser.html文件（如下粗体部份），在它的url请求中把我们定义目录加入到get参数列中，这样它就可以传到</span>fckeditor_controller.rb里了<span style="color: rgb(0, 0, 0);">。<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);"><br />var sServerPath </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> GetUrlParam( </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">ServerPath</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> ) ;<br /></span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> ( sServerPath.length </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);"> )<br />    oConnector.ConnectorUrl </span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">ServerPath=</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> escape( sServerPath ) </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> ;<br /><br /><b>var sUploaded </b></span><b><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> GetUrlParam( </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">uploaded</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> ) ;<br /></span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> ( sUploaded.length </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);"> )<br />    oConnector.ConnectorUrl </span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">uploaded=</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> escape( sUploaded ) </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">'</span></b><span style="color: rgb(0, 0, 0);"><b> ;</b><br /><br />oConnector.ResourceType        </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> GetUrlParam( </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">Type</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> ) ;<br />oConnector.ShowAllTypes        </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> ( oConnector.ResourceType.length </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);"> ) ;<br /><br /></span></div><br />3.  上面</span>的GetUrlParam( 'uploaded' ) 的值来自于fckcustom.js。修改fckcustom.js（如下粗体部份），把uploaded加入到get参数列中。<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">//</span><span style="color: rgb(0, 0, 0);"> CHANGE FOR APPS HOSTED IN SUBDIRECTORY<br />FCKRelativePath </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">''</span><span style="color: rgb(0, 0, 0);">;<br /><br /></span><span style="color: rgb(0, 0, 0);">//</span><span style="color: rgb(0, 0, 0);"> DON</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">T CHANGE THESE</span><span style="color: rgb(128, 0, 0);"><br /></span><span style="color: rgb(0, 0, 0);">FCKConfig.LinkBrowserURL </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> FCKConfig.BasePath </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">filemanager/browser/default/browser.html?Connector=</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">FCKRelativePath</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">/fckeditor/command</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">;<br />FCKConfig.ImageBrowserURL </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> FCKConfig.BasePath </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">filemanager/browser/default/browser.html?<b>uploaded=</b></span><b><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">FCKConfig.uploaded</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(128, 0, 0);">'</span></b><span style="color: rgb(128, 0, 0);"><b>&amp;</b>Type=Image&amp;Connector=</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">FCKRelativePath</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">/fckeditor/command</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">;<br />FCKConfig.FlashBrowserURL </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> FCKConfig.BasePath </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">filemanager/browser/default/browser.html?<b>uploaded=</b></span><b><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">FCKConfig.uploaded</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(128, 0, 0);">'</span></b><span style="color: rgb(128, 0, 0);"><b>&amp;</b>Type=Flash&amp;Connector=</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);">FCKRelativePath</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">/fckeditor/command</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">;<br /><br />FCKConfig.LinkUploadURL </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> FCKRelativePath</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">/fckeditor/upload</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">;<br />FCKConfig.ImageUploadURL </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> FCKRelativePath</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">/fckeditor/upload?Type=Image<b>&amp;uploaded=</b></span><b><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">+</span></b><span style="color: rgb(0, 0, 0);"><b>FCKConfig.uploaded</b>;<br />FCKConfig.FlashUploadURL </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> FCKRelativePath</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">/fckeditor/upload?Type=Flash<b>&amp;uploaded=</b></span><b><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">+</span></b><span style="color: rgb(0, 0, 0);"><b>FCKConfig.uploaded</b>;<br />FCKConfig.AllowQueryStringDebug </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> false;<br />FCKConfig.SpellChecker </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">SpellerPages</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">;<br /><br /></span><span style="color: rgb(0, 0, 0);">//</span><span style="color: rgb(0, 0, 0);"> ONLY CHANGE BELOW HERE<br />FCKConfig.SkinPath </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> FCKConfig.BasePath </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">skins/silver/</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">;<br />FCKConfig.AutoDetectLanguage </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> false ;<br />FCKConfig.DefaultLanguage </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">zh-cn</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> ;<br />FCKConfig.FontNames </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">微软雅黑;宋体;黑体;隶书;楷体_GB2312;Arial;Comic Sans MS;Courier New;Tahoma;Times New Roman;Verdana</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> ;<br /><br />FCKConfig.ToolbarSets[</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">Simple</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [<br />    [</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Source</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">-</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">FitWindow</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Preview</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">-</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Templates</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">],<br />    [</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">PasteText</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">PasteWord</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">],<br />    [</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Undo</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Redo</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Find</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Replace</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">],<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">/</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    [</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">RemoveFormat</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Bold</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Italic</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Underline</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">StrikeThrough</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">],<br />    [</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">OrderedList</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">UnorderedList</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Outdent</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Indent</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">],<br />    [</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">JustifyLeft</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">JustifyCenter</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">JustifyRight</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">JustifyFull</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">],<br />        [</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">TextColor</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">BGColor</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">],<br />    [</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Link</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Unlink</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Anchor</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">],<br />    [</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Image</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Flash</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Table</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Rule</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Smiley</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">],<br />    </span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">/</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,<br />    [</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">Style</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">FontFormat</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">FontName</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(128, 0, 0);">FontSize</span><span style="color: rgb(128, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">]<br />] ;<br /></span></div><br />4. 上面FCKConfig.uploaded的值来自于fckeditor.rb。在fckeditor.rb中加入一句（如下粗体所示）。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">      javascript_tag( </span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">var oFCKeditor = new FCKeditor('#{id}', '#{width}', '#{height}', '#{toolbarSet}');\n</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"><br />                      </span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">oFCKeditor.BasePath = \</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">{base_path}\"\n"+</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">                      </span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">oFCKeditor.Config['CustomConfigurationsPath'] = '../../fckcustom.js';\n</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"><br /><b>                      </b></span><b><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">oFCKeditor.Config['uploaded'] = '#{options[:path]}';\n</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">+</span></b><span style="color: rgb(0, 0, 0);"><br />                      </span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(128, 0, 0);">oFCKeditor.ReplaceTextarea();\n</span><span style="color: rgb(128, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)                         <br /></span></div><br />5.<b><span style="color: rgb(0, 0, 0);"></span></b>不过上面oFCKeditor.Config['uploaded']的值要传到fckcustom.js的FCKConfig.uploaded里，还需要修改fckeditorcode_gecko.js和fckeditorcode_ie.js（这两个文件对javascript进行了压缩处理，修改起来较难操作）。我是参考了oFCKeditor.Config['CustomConfigurationsPath'] 这个参数的载入实现，才找到这种鸟不生蛋的地方。搜索这两个文件的关键字<span style="color: rgb(0, 0, 0);">CustomConfigurationsPath</span>，找到如下一行，然后加入一个else if判断(如下粗体所示）。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (D</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">CustomConfigurationsPath</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">) FCKConfig[D]</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">E;</span><b><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (D</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">uploaded</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">) FCKConfig[D]</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">E;</span></b><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> (E.toLowerCase()</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">true</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 255);">this</span><span style="color: rgb(0, 0, 0);">.PageConfig[D]</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">;</span></div><br /><span style="color: rgb(0, 0, 0);"></span><br />6.最后在fckeditor.rb里的#{options[:path]}来自于我们前台的view了。如下粗体所示，把标准的fckedit<span style="color: rgb(0, 0, 0);">or_textarea新增加了一个参数，其中</span><span style="color: rgb(0, 0, 0);">params[:user_id]是把</span><span style="color: rgb(0, 0, 0);">用户的ID值做为</span><span style="color: rgb(0, 0, 0);">目录名。这样就实现了动态改变FCKEditor的上传目录。</span><br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">&lt;%=</span><span style="color: rgb(0, 0, 0);">fckeditor_textarea(:topic, :content, :ajax </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">, :toolbarSet </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">Simple</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">, :height </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">400px</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,  :path </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">/uploads/#{params[:user_id]}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 0);">%&gt;</span></div><br /><br />修改完后需要重启WEB服务，最后别忘记把public/javascripts/fckeditor和vendor/plugins/fckeditor/public/javascripts同步一下，原因见http://www.blogjava.net/chengang/archive/2007/09/24/147867.html<span style="color: rgb(0, 0, 0);"><b><br /></b></span><img src ="http://www.blogjava.net/chengang/aggbug/148114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-09-26 10:13 <a href="http://www.blogjava.net/chengang/archive/2007/09/26/148114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>定制FCKEditor，以及使其中文化</title><link>http://www.blogjava.net/chengang/archive/2007/09/24/147867.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Mon, 24 Sep 2007 10:24:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/09/24/147867.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/147867.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/09/24/147867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/147867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/147867.html</trackback:ping><description><![CDATA[安装完FCKEditor还是不够的，首先就面临两个任务：（1）将它中文化。（2）有些功能不需要的，就需要把它去掉。FCKEditor在这方面做得很好，其可定制性相当强。<br /><div align="center">文/陈刚  <a title="www.chengang.com.cn" href="www.chengang.com.cn">www.chengang.com.cn</a><br /></div>首先，我们来看看FCKEditor在Rails中的运行特性，其插件主要是安装在vendor/plugins/fckeditor。主要的代码在vendor/plugins/fckeditor/public/javascripts，其中fckcustom.js是配置文件，另外更深一层的子目录fckeditor中还有一个fckconfig.js也是配置文件。fckcustom.js配置的优先顺序大于fckconfig.js，因此一般修改fckcustom.js就可以了，不必去动fckconfig.js。<br /><br />在启动WEBrick( ruby script/server)时，会自动把vendor/plugins/fckeditor/public/javascripts的内容复制到public/javascripts目录。因此如果你修改了FCKEditor的配置文件之后，需要把复制到public/javascripts目录的FCKEditor相关文件删除掉，然后再重启WEBrick。当然，你也可以直接修改public/javascripts目录的FCKEditor的缓存的配置文件，这样不必重启WEBrick，就可以立即看到修改效果。不过建议你在完成修改后，同时也要更新vendor/plugins/fckeditor/public/javascripts下的配置文件，毕竟public/javascripts里的应该算是临时文件。<br /><br /><br />1.中文化<br /><br />在fckcustom.js里加入两项（粗体显示）<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">FCKConfig</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">SkinPath </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> FCKConfig</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">BasePath </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">skins/silver/</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);">;<br /><b><font color="#ff0000">FCKConfig</font></b></span><font color="#000000"><b><font color="#ff0000"><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">AutoDetectLanguage </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> false ;<br />FCKConfig</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">DefaultLanguage </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">zh-cn</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span></font></b><span style="color: rgb(0, 0, 0);"><b><font color="#ff0000"> </font>;</b><br /></span></font></div><br />2. 定制FCKEditor的工具栏<br />修改fckcustom.js里的如下项目，增删改自便。<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">FCKConfig</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">ToolbarSets[</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0); font-weight: bold;">Simple</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0);">] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [   。。。 。。。<br /></span></div><br />这里要注意一点，有些网上文章把<span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">toolbarSet写成了</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">toolbarKit，这是错误的。如果你发现对工具栏的配置不起作用，那么要检查一下。正确的写法如下：<br /></span><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);">&lt;%=</span><span style="color: rgb(0, 0, 0);">fckeditor_textarea(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">topic</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">content</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">ajax </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> true</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">toolbarSet </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">Simple</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">width </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">100%</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">height </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">300px</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);">) </span><span style="color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);"><br /></span></div><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/chengang/aggbug/147867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-09-24 18:24 <a href="http://www.blogjava.net/chengang/archive/2007/09/24/147867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>error_messages_for的中文化</title><link>http://www.blogjava.net/chengang/archive/2007/09/19/146548.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Wed, 19 Sep 2007 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/09/19/146548.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/146548.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/09/19/146548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/146548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/146548.html</trackback:ping><description><![CDATA[在Rails中error_messages_for为国际化的考虑不是很周全，它显示的是模型的字段名称，这对于用户来说是不友好的。为了解决这个问题，只能改它的源码了----将如下方法，放入<span style="color: rgb(0, 0, 0);">ApplicationHelper<br /></span><div align="center"><span style="color: rgb(0, 0, 0);">文/陈刚  www.chengang.com.cn  转载请声明出处</span><span style="color: rgb(0, 0, 0);"></span></div><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 128, 0);"></span><span style="color: rgb(0, 0, 0);">  def error_messages_for(</span><span style="color: rgb(0, 0, 0);">*</span><span style="color: rgb(0, 0, 0);">params)<br />    </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">add by glchengang</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">    key_hash </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> {}<br />    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> params</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">first</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">is_a</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);">(Hash)<br />      key_hash </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">  params</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">first<br />      params</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">delete_at(</span><span style="color: rgb(128, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">)<br />    end<br />    </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">add end</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />    options </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> params</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 255);">last</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">is_a</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);">(Hash) </span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);"> params</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 255);">pop</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">symbolize_keys </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);"> {}<br />    objects </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> params</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">collect {</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">object_name</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"> instance_variable_get(</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0); font-weight: bold;">@#{object_name}</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0);">) }</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">compact<br />    count   </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> objects</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">inject(</span><span style="color: rgb(128, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">) {</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">sum</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> object</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"> sum </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> object</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">errors</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">count }<br />    </span><span style="color: rgb(0, 0, 255);">unless</span><span style="color: rgb(0, 0, 0);"> count</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">zero</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);"><br />      html </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> {}<br />      [</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">id</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">class]</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 255);">each</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">key</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> options</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">include</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);">(key)<br />          value </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> options[key]<br />          html[key] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> value </span><span style="color: rgb(0, 0, 255);">unless</span><span style="color: rgb(0, 0, 0);"> value</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">blank</span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);"><br />        </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />          html[key] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">errorExplanation</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);"><br />        end<br />      end<br />      </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> change by glchengang</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">      header_message </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0); font-weight: bold;">有#{count}个错误</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">       header_message = "#{pluralize(count, 'error')} prohibited this #{(options[:object_name] || params.first).to_s.gsub('_', ' ')} from being saved"<br />      <br />      #add by glchengang</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">      error_messages </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> objects</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 255);">map</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">object</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />        temp </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> []<br />        object</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">errors</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 255);">each</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">attr</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> msg</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />          temp </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> content_tag(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">li</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> (key_hash[attr] </span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);"> attr) </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> msg) <br />        end<br />        temp<br />      end<br />      </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">add end<br /><br />#        error_messages = objects.map {|object| object.errors.full_messages.map {|msg| content_tag(:li, msg) } }</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">      content_tag(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">div</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"><br />        content_tag(options[</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">header_tag] </span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">h2</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> header_message) </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"><br /></span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">           content_tag(:p, 'There were problems with the following fields:') &lt;&lt;</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">          content_tag(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">ul</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> error_messages)</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"><br />        html<br />      )<br />    </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />      </span><span style="color: rgb(0, 0, 0); font-weight: bold;">''</span><span style="color: rgb(0, 0, 0);"><br />    end<br />  end</span></div><br /><br />使用依然兼容老的方式，你也可以传入一个哈希表，把模型字段显示成对应的中文，示例如下：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">&lt;%=</span><span style="color: rgb(0, 0, 0);"> <br />h </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> {</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">username</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">用户名</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">password</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">密码</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);">}<br />error_messages_for h</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">user<br /></span><span style="color: rgb(0, 0, 0);">%&gt;</span></div><br /><p>另外，还要在environment.rb的最后插入以下代码：
<br /></p><p></p><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">errors </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> ActiveRecord</span><span style="color: rgb(0, 0, 0);">::</span><span style="color: rgb(0, 0, 0);">Errors</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">default_error_messages<br />errors[</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">taken] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">已经被使用</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0);"><br />errors[</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">blank] </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span><span style="color: rgb(0, 0, 0); font-weight: bold;">不能为空</span><span style="color: rgb(0, 0, 0); font-weight: bold;">'</span></div><br /><img src ="http://www.blogjava.net/chengang/aggbug/146548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-09-19 17:35 <a href="http://www.blogjava.net/chengang/archive/2007/09/19/146548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让will_paginate的分页支持ajax</title><link>http://www.blogjava.net/chengang/archive/2007/09/02/142077.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Sun, 02 Sep 2007 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/09/02/142077.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/142077.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/09/02/142077.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/142077.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/142077.html</trackback:ping><description><![CDATA[关于will_paginate插件，请看这个帖子: http://mmm.javaeye.com/blog/116931。<br /><div align="center">文/陈刚 (www.chengang.com.cn)<br /></div>
但一直搜不到它支持ajax分面的方法 ，于是我参考它分页方法的源代码(位于:vendor/plugins/will_paginate/lib/will_paginate/view_helpers.rb)，稍微改写，变成了一个支持ajax的分页方法。以下代码复制到application_helper里即可。<br /><br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);"><br />
  </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">-----------------------------------------</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> will_paginate插件的ajax分页</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">-----------------------------------------</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">  @@pagination_options </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> { </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">pagination</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"><br />
        </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">prev_label   </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">上一页</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"><br />
        </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">next_label   </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">下一页</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"><br />
        </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">inner_window </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">4</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> links around the current page</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">outer_window </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> links around beginning and end</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">separator    </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);"> single space is friendly to spiders and non-graphic browsers</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">param_name   </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">page</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"><br />
        </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">add by chengang</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">update </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"></span><span style="color: rgb(0, 0, 0);">nil</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">ajax所要更新的html元素的id</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">url_suffix </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">''</span><span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">url的后缀，主要是为了补全REST所需要的url</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">add end</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">        }<br />
  mattr_reader </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">pagination_options<br /><br />
  def will_paginate_remote(entries </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> @entries</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> options </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> {})<br />
    total_pages </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> entries</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">page_count<br /><br />
    </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> total_pages </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
      options </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> options</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">symbolize_keys</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">reverse_merge(pagination_options)<br />
      page</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> param </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> entries</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">current_page</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> options</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">delete(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">param_name)<br />
      <br />
      inner_window</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> outer_window </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> options</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">delete(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">inner_window)</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">to_i</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> options</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">delete(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">outer_window)</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">to_i<br />
      </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">add by chengang</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">      update </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">  options</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">delete(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">update)<br />
      suffix </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">  options</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">delete(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">url_suffix)<br />
      url </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> request</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">env[</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">PATH_INFO</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">] <br />
      url </span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);"> suffix </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> suffix<br />
      </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">add end</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />
      </span><span style="color: rgb(0, 128, 128);">min</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> page </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> inner_window<br />
      </span><span style="color: rgb(0, 128, 128);">max</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> page </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> inner_window<br />
      </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 128);">max</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> total_pages then </span><span style="color: rgb(0, 128, 128);">min</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">-=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 128);">max</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> total_pages<br />
      elsif </span><span style="color: rgb(0, 128, 128);">min</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">  then </span><span style="color: rgb(0, 128, 128);">max</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 128);">min</span><span style="color: rgb(0, 0, 0);"><br />
      </span><span style="color: rgb(0, 128, 128);">end</span><span style="color: rgb(0, 0, 0);"><br />
      <br />
      </span><span style="color: rgb(0, 128, 128);">current</span><span style="color: rgb(0, 0, 0);">   </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 128);">min</span><span style="color: rgb(0, 0, 0);">..</span><span style="color: rgb(0, 128, 128);">max</span><span style="color: rgb(0, 0, 0);"><br />
      beginning </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);">..</span><span style="color: rgb(0, 0, 0);">(</span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">+</span><span style="color: rgb(0, 0, 0);"> outer_window)<br />
      tail      </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (total_pages </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> outer_window)</span><span style="color: rgb(0, 0, 0);">..</span><span style="color: rgb(0, 0, 0);">total_pages<br />
      visible   </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> [beginning</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 128);">current</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> tail]</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">map(</span><span style="color: rgb(0, 0, 0);">&amp;:</span><span style="color: rgb(0, 0, 0);">to_a)</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">flatten</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 128, 128);">sort</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">uniq<br />
      links</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 128);">prev</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> []</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);"><br /><br />
      visible</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 128, 128);">each</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">do</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);">n</span><span style="color: rgb(0, 0, 0);">|</span><span style="color: rgb(0, 0, 0);"><br />
        </span><span style="color: rgb(0, 128, 128);">next</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> n </span><span style="color: rgb(0, 0, 0);">&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
        </span><span style="color: rgb(0, 0, 255);">break</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);"> n </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> total_pages<br /><br />
        unless n </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 128, 128);">prev</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
          </span><span style="color: rgb(0, 128, 128);">prev</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> n<br />
          </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">change by chengang</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">          text </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> (n</span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);">page </span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);"> n </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">[#{n}]</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">)<br />
          links </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> page_link_remote_or_span((n </span><span style="color: rgb(0, 0, 0);">!=</span><span style="color: rgb(0, 0, 0);"> page </span><span style="color: rgb(0, 0, 0);">?</span><span style="color: rgb(0, 0, 0);"> n </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);"> nil)</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">current</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> text</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> param</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> update</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> url)<br />
        </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />
          </span><span style="color: rgb(0, 128, 128);">prev</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);"> n </span><span style="color: rgb(0, 0, 0);">-</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">1</span><span style="color: rgb(0, 0, 0);"><br />
          links </span><span style="color: rgb(0, 0, 0);">&lt;&lt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><img src="http://www.blogjava.net/images/dot.gif" alt="" /></span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);"><br />
          redo<br />
        </span><span style="color: rgb(0, 128, 128);">end</span><span style="color: rgb(0, 0, 0);"><br />
      </span><span style="color: rgb(0, 128, 128);">end</span><span style="color: rgb(0, 0, 0);"><br />
      <br />
      </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">change by chengang</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);">      links</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">unshift page_link_remote_or_span(entries</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">previous_page</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">disabled</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> options</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">delete(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">prev_label)</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> param</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> update</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> url)<br />
      links</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">push    page_link_remote_or_span(entries</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">next_page</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);">     </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">disabled</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> options</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">delete(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">next_label)</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> param</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> update</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> url)<br />
      </span><span style="color: rgb(0, 128, 0);">#</span><span style="color: rgb(0, 128, 0);">change end</span><span style="color: rgb(0, 128, 0);"><br /></span><span style="color: rgb(0, 0, 0);"><br />
      content_tag </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">div</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> links</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 128, 128);">join</span><span style="color: rgb(0, 0, 0);">(options</span><span style="color: rgb(0, 0, 0);">.</span><span style="color: rgb(0, 0, 0);">delete(</span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">separator))</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> options<br />
    </span><span style="color: rgb(0, 128, 128);">end</span><span style="color: rgb(0, 0, 0);"><br />
  </span><span style="color: rgb(0, 128, 128);">end</span><span style="color: rgb(0, 0, 0);"><br />
  <br /></span><span style="color: rgb(0, 0, 255);">protected</span><span style="color: rgb(0, 0, 0);"><br /><br />
  def page_link_remote_or_span(page</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> span_class</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> text</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> param</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> update</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> url)<br />
    unless page<br />
      content_tag </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">span</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> text</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> span_class<br />
    </span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />
      link_to_remote text</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">update </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> update</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">url </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">#{url}?#{param.to_sym}=#{page}</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">method</span><span style="color: rgb(0, 0, 0);">=&gt;:</span><span style="color: rgb(0, 0, 0);">get<br />
    </span><span style="color: rgb(0, 128, 128);">end</span><span style="color: rgb(0, 0, 0);"><br />
  </span><span style="color: rgb(0, 128, 128);">end</span><span style="color: rgb(0, 0, 0);"><br /><br /></span></div><br />
在view中的使用如下所示:<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 0);">          </span><span style="color: rgb(0, 0, 0);">&lt;%=</span><span style="color: rgb(0, 0, 0);">will_paginate_remote @topics</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">update </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">topicList</span><span style="color: rgb(0, 0, 0);">'</span><span style="color: rgb(0, 0, 0);">,</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">:</span><span style="color: rgb(0, 0, 0);">url_suffix </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> url_suffix</span><span style="color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span></div><br /><br /><img src ="http://www.blogjava.net/chengang/aggbug/142077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-09-02 15:42 <a href="http://www.blogjava.net/chengang/archive/2007/09/02/142077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Rails中使用FCKeditor插件实现WEB富文本编辑</title><link>http://www.blogjava.net/chengang/archive/2007/08/25/139287.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Sat, 25 Aug 2007 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/08/25/139287.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/139287.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/08/25/139287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/139287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/139287.html</trackback:ping><description><![CDATA[比如象BlogJava这里编辑器就应该是用的FCKeditor
，FCKeditor 相当有名，它有PHP、JSP、rails等多个版本，核心都是一些javascript代码。<br /><br /><div style="text-align: center;">文/陈刚  (www.chengang.com.cn)<br /></div><br />环境：ubuntu linux 7.0.4  +  ruby 1.8.5 + Rails 1.2.3 + FCKeditor 0.4.1
<br /><br />直接从它的subversion库里取得该Rails插件。先进入到你的项目根目录，再执行如下命令<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->ruby script/plugin install svn://rubyforge.org/var/svn/fckeditorp/trunk/fckeditor<br /></div><br />其他说明：<br />(1)你的linux必须先安装了subversion。（ubuntu里用新立得搜subversion即得）<br />(2)把命令中的install 改为 destory，可以删除安装。<br />(3)我取到的是2007年4月份最后更新的, v 0.4.1版<br />(4)FCKeditor安装在项目根目录下的vendor/plugins/fckeditor
里，<br />(5)vendor/plugins/fckeditor里的README很值得一读，我碰到Ajax问题，查了所以网上的中文资料都没有提到，在这个README却有。<br /><br /><br />用如下语句在页面里含入它的javascript库<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">&lt;%=</span><span style="color: rgb(0, 0, 0);"> javascript_include_tag :fckeditor </span><span style="color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);">  </span></div>
或<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">&lt;%=</span><span style="color: rgb(0, 0, 0);"> javascript_include_tag </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">fckeditor/fckeditor</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span></div><br /><br />在需要富文本的Form表单用如下语句生成一个富文件编辑框：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">&lt;%=</span><span style="color: rgb(0, 0, 0);"> fckeditor_textarea(</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">topic</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, </span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">content</span><span style="color: rgb(0, 0, 0);">"</span><span style="color: rgb(0, 0, 0);">, :toolbarSet </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> 'Simple', :width </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> '</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">', :height </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> '200px') </span><span style="color: rgb(0, 0, 0);">%&gt;</span></div><br />说明：topic对应模型对象,content对应它的字段。也就是要求当前页要有@topic这个实例变量。<br /><br /><br />如果是用了ajax，则需要在form_remote_tag加上一个before项<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">  </span><span style="color: rgb(0, 0, 0);">&lt;%=</span><span style="color: rgb(0, 0, 0);"> form_remote_tag(:update </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> update,<br />                     <span style="color: red;"> :before </span></span><span style="color: red;">=&gt;</span><span style="color: rgb(0, 0, 0);"><span style="color: red;"> fckeditor_before_js('topic', 'content'),</span><br />                      :url </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> {:controller </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> 'topics', :action </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> 'create', :template </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> 'show'} )</span><span style="color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span></div><br />并且富文件编辑框要加一个ajax=true的选项：<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 0);">&lt;%=</span><span style="color: rgb(0, 0, 0);"> fckeditor_textarea(:topic, :content, <span style="color: red;">:ajax </span></span><span style="color: red;">=&gt; true</span><span style="color: rgb(0, 0, 0);"><span style="color: red;">, </span>:toolbarKit </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> 'Simple', :width </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> '</span><span style="color: rgb(0, 0, 0);">100</span><span style="color: rgb(0, 0, 0);">%</span><span style="color: rgb(0, 0, 0);">', :height </span><span style="color: rgb(0, 0, 0);">=&gt;</span><span style="color: rgb(0, 0, 0);"> '600px') </span><span style="color: rgb(0, 0, 0);">%&gt;</span><span style="color: rgb(0, 0, 0);"><br /></span></div><br /><br /><br /><br /><br />在使上传图片的功能时碰到了错误。弹出出alert对话框，显示：Error on file upload.Error number: 403
<br /><p>在日志里显示如下，表面上看好象是路由配置的问题</p><p>ActionController::RoutingError (no route found to match "/fckblank.html" with {:method=&gt;:get}):
<br />    /var/lib/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/routing.rb:1292:in `recognize_path'
<br />    /var/lib/gems/1.8/gems/actionpack-1.13.3/lib/action_controller/routing.rb:1282:in `recognize'
<br />    /var/lib/gems/1.8/gems/rails-1.2.3/lib/dispatcher.rb:40:in `dispatch'
<br />    /var/lib/gems/1.8/gems/rails-1.2.3/lib/webrick_server.rb:113:in `handle_dispatch'
<br />    /var/lib/gems/1.8/gems/rails-1.2.3/lib/webrick_server.rb:79:in `service'
<br />    /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
<br />    /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
<br />    /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
<br />    /usr/lib/ruby/1.8/webrick/server.rb:162:in `start'
<br />    /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'</p><br />最后在http://blog.caronsoftware.com/articles/2006/12/03/fckeditor-0-4-0-released#comment-1745找到了答案，这是一个BUG
<p>解决方法 ：<br /></p><p>修改：vendor/plugins/fckeditor/app/controller/fckeditor_controller.rb<br />将原来的<br /></p><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">unless</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0); font-weight: bold;">#{file.class}</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0); font-weight: bold;">Tempfile</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span></div><br />改为<br /><div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: rgb(0, 0, 255);">unless</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0); font-weight: bold;">#{file.class}</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0); font-weight: bold;">Tempfile</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">||</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0); font-weight: bold;">#{file.class}</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">==</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span><span style="color: rgb(0, 0, 0); font-weight: bold;">StringIO</span><span style="color: rgb(0, 0, 0); font-weight: bold;">"</span></div><br /><br /><br /><img src ="http://www.blogjava.net/chengang/aggbug/139287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-08-25 16:44 <a href="http://www.blogjava.net/chengang/archive/2007/08/25/139287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mootools VS prototype</title><link>http://www.blogjava.net/chengang/archive/2007/08/23/138780.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Thu, 23 Aug 2007 04:11:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/08/23/138780.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/138780.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/08/23/138780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/138780.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/138780.html</trackback:ping><description><![CDATA[<br>前天为了实现一个Lightbox的效果，搜了一些资料，引出了mootools这一个javascript库(<a title="http://mootools.net/" href="http://mootools.net/">http://mootools.net/</a>
)。其效果的确很酷，这个是它的常见效果实现一览表<a title="http://demos.mootools.net/" href="http://demos.mootools.net/">http://demos.mootools.net/</a>
。<br><br>我觉得mootools比prototype强的地方，就是它的理念更OO，重点表现在它把javascript、html、css完全分离开来，用mootools的话,html里干净得找不到javascript的影子。javascript、html
分离，这很重要。<br><br>其次
，mootools的文档很不错，在http://demos.mootools.net/
这个效果一览表中，你可以很轻松的看到实现效果的代码。代码清晰的分为三个部份javascript、html、css，你只要将这些代码复制到你的项目中就能得到预期的效果。它的javascript代码对于有java或OO基础的人相当易懂。<br>
<br><br>再次，下载的mootools是压过编码压缩的了的，这使得javascript文件更小，选择所有部件后大约是30K。而prototype是100多K，当然prototype也可以用javascript压缩工具压缩一下。<br><br><br>唯一遗憾的是Rails默认支持的是prototype，而非mootools。当然我们也可以在Rails项目中抛弃prototype改用mootools，但rails那些对javascript做了封装的helper方法就用不了。这是一个不小损失。<br><br><br><br>   <img src ="http://www.blogjava.net/chengang/aggbug/138780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-08-23 12:11 <a href="http://www.blogjava.net/chengang/archive/2007/08/23/138780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rails验证码图片的实现</title><link>http://www.blogjava.net/chengang/archive/2007/08/17/137683.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Fri, 17 Aug 2007 11:48:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/08/17/137683.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/137683.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/08/17/137683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/137683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/137683.html</trackback:ping><description><![CDATA[第一步：安装必须的软件<br><br>
<pre style="text-align: left;"><code>在linux下生成图片需要图片处理软件ImageMagick的Ruby语言RMagick库支持。安装RMagick最麻烦，我查了N多资料试了N次才安装成功。</code>
<code>   1. 安装ImageMagick：sudo apt-get install imagemagick</code>
<code>   2. 查看安装结果：dpkg -l | grep magick</code>
<code>   3. 更新软件包列表：sudo apt-get update</code>
<code>   4. 安装图片处理软件包libmagick9-dev：sudo apt-get install libmagick9-dev ruby1.8-dev</code>
<code>   5. 安装接口软件包RMagick：sudo gem install rmagick</code>
<code>   6. 说明：如果出现问题或者错误请执行下面命令：sudo apt-get remove --purge libmagick9-dev</code>
<code><br>在irb里require 'RMagick'。如果返回true，表示安装成功。</code></pre>
<br>第二步：编码<br><br>在models目录创建一个proof_image.rb<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">require&nbsp;'rubygems'<br>require&nbsp;'RMagick'<br>class&nbsp;ProofImage<br>&nbsp;&nbsp;include&nbsp;Magick<br>&nbsp;&nbsp;attr_reader&nbsp;:text,&nbsp;:image<br>&nbsp;&nbsp;Jiggle&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;"><br>&nbsp;&nbsp;Wobble&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;def&nbsp;initialize(len</span><span style="color: #000000;">=</span><span style="color: #000000;">4</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;chars&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;('a'..'z').to_a&nbsp;#&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;('</span><span style="color: #000000;">0</span><span style="color: #000000;">'..'</span><span style="color: #000000;">9</span><span style="color: #000000;">').to_a<br>&nbsp;&nbsp;&nbsp;&nbsp;text_array</span><span style="color: #000000;">=</span><span style="color: #000000;">[]<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.upto(len)&nbsp;{text_array&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;chars[rand(chars.length)]}<br>&nbsp;&nbsp;&nbsp;&nbsp;#background_type&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">granite:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;#花岗岩<br>&nbsp;&nbsp;&nbsp;&nbsp;#background_type&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">netscape:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;#彩条<br>&nbsp;&nbsp;&nbsp;&nbsp;#background_type&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">xc:#EDF7E7</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;#指定背景色,例：xc:red<br>&nbsp;&nbsp;&nbsp;&nbsp;#background_type&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">null:</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;#纯黑<br>&nbsp;&nbsp;&nbsp;&nbsp;granite&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Magick::ImageList.</span><span style="color: #0000ff;">new</span><span style="color: #000000;">('</span><span style="color: #0000ff;">null</span><span style="color: #000000;">:')<br>&nbsp;&nbsp;&nbsp;&nbsp;canvas&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Magick::ImageList.</span><span style="color: #0000ff;">new</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;canvas.new_image(</span><span style="color: #000000;">32</span><span style="color: #000000;">*</span><span style="color: #000000;">len,&nbsp;</span><span style="color: #000000;">50</span><span style="color: #000000;">,&nbsp;Magick::TextureFill.</span><span style="color: #0000ff;">new</span><span style="color: #000000;">(granite))<br>&nbsp;&nbsp;&nbsp;&nbsp;gc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Magick::Draw.</span><span style="color: #0000ff;">new</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;gc.font_family&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'times'<br>&nbsp;&nbsp;&nbsp;&nbsp;gc.pointsize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">40</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;cur&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;text_array.each{</span><span style="color: #000000;">|</span><span style="color: #000000;">c</span><span style="color: #000000;">|</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rand(</span><span style="color: #000000;">10</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;rot</span><span style="color: #000000;">=</span><span style="color: #000000;">rand(Wobble):rot</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">rand(Wobble)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rand(</span><span style="color: #000000;">10</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;weight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NormalWeight&nbsp;:&nbsp;weight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;BoldWeight<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gc.annotate(canvas,</span><span style="color: #000000;">0</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,cur,</span><span style="color: #000000;">30</span><span style="color: #000000;">+</span><span style="color: #000000;">rand(Jiggle),c){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.rotation</span><span style="color: #000000;">=</span><span style="color: #000000;">rot<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.font_weight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;weight<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.fill&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;'green'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">30</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;@text&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;text_array.to_s<br>&nbsp;&nbsp;&nbsp;&nbsp;@image&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;canvas.to_blob{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.format</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">GIF</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;#生成图片文件<br>&nbsp;&nbsp;&nbsp;&nbsp;#text.text(</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;#text.draw(canvas)<br>&nbsp;&nbsp;&nbsp;&nbsp;#canvas.write('test.gif')&nbsp;#图片位于项目根目录下。也可以使用linux中的绝对路径如:</span><span style="color: #000000;">/</span><span style="color: #000000;">home</span><span style="color: #000000;">/</span><span style="color: #000000;">chengang</span><span style="color: #000000;">/</span><span style="color: #000000;">test.gif<br><br>&nbsp;&nbsp;end<br>end<br></span></div>
<br><br>在一个controller里加入一个方法，方法的作用是向网页提供图片数据。我选择创建一个专门的UtilController。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">class&nbsp;UtilController&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;ApplicationController<br><br>&nbsp;&nbsp;def&nbsp;proof_image<br>&nbsp;&nbsp;&nbsp;&nbsp;proof_image&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ProofImage.</span><span style="color: #0000ff;">new</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;session[:proof_text]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;proof_image.text<br>&nbsp;&nbsp;&nbsp;&nbsp;send_data&nbsp;proof_image.image,&nbsp;:type&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;'image</span><span style="color: #000000;">/</span><span style="color: #000000;">jpeg',&nbsp;:disposition&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;'inline'<br>&nbsp;&nbsp;end<br><br>end</span></div>
<br><br>以下是在页面中的调用代码：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">输入验证码:</span><span style="color: #000000;">&lt;%=</span><span style="color: #000000;">text_field(:proof,&nbsp;:text,&nbsp;:maxlength</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">4</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">%&gt;</span><span style="color: #000000;"><br></span><span style="color: #000000;">&lt;</span><span style="color: #000000;">img&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">img</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;src</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/chen/util/proof_image</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #000000;">&lt;</span><span style="color: #000000;">a&nbsp;href</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">#</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;onclick</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">changeImage();return&nbsp;false;</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">换一个验证码</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">a</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">br</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br></span></div>
<br><br>
其中changeImage()是一个javascript函数，因为换图片时必须改变&lt;img的src，否则浏览器不会执行UtilController的proof_image方法，而是从缓存中取得图片数据。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;changeImage(){<br>&nbsp;&nbsp;$(</span><span style="color: #000000;">"</span><span style="color: #000000;">img</span><span style="color: #000000;">"</span><span style="color: #000000;">).src&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">/chen/util/proof_image?tmp=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Date().getTime();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;Math.random();</span><span style="color: #008000;"><br></span><span style="color: #000000;">}</span></div>
<br><br>我的环境：ubuntu 7.04 + Rails 1.2.3 +Ruby 1.8.5<br><br><img src ="http://www.blogjava.net/chengang/aggbug/137683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-08-17 19:48 <a href="http://www.blogjava.net/chengang/archive/2007/08/17/137683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习REST on Rails的途径</title><link>http://www.blogjava.net/chengang/archive/2007/08/15/136905.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Wed, 15 Aug 2007 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/08/15/136905.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/136905.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/08/15/136905.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/136905.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/136905.html</trackback:ping><description><![CDATA[<p>昨天开始接触学习REST，是个新手。用一个下午的时间baidu了一些REST资料，又重点翻看 了javaeye所有关键词是REST的贴子。在了解和学习之后，我认为REST是值得去尝试的。</p>
<p>我学习REST的途径如下：</p>
<p>1、学习REST，下面这一篇翻译自&lt;&lt;RESTful Rails Development&gt;&gt;文档基本就够了。感谢yananay的辛苦翻译，翻译得相当流畅。
<br><a href="http://www.javaeye.com/topic/89133" target="blank">http://www.javaeye.com/topic/89133</a></p>
<p>2、其次是看别人是怎么用REST的，大家一致推荐beast网站，具体的内容在这个贴子上
<br><a href="http://www.javaeye.com/topic/39355" target="blank">http://www.javaeye.com/topic/39355</a></p>
<p>3、另外再附一篇Rails创始人DHH的演讲翻译稿，这让我们能大概搞清楚REST是什么，它的初衷是什么：<a href="http://blog.csdn.net/myan/archive/2006/11/25/1413933.aspx" target="blank">http://blog.csdn.net/myan/archive/2006/11/25/1413933.aspx</a></p>
<p>看完＜RESTful Rails Development＞就可以开始对自己的网站重构了，有不懂的地方再参考一下别人beast是怎么实现的。</p>
<br><img src ="http://www.blogjava.net/chengang/aggbug/136905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-08-15 14:49 <a href="http://www.blogjava.net/chengang/archive/2007/08/15/136905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>＜Programming Ruby中文版＞ 读后感</title><link>http://www.blogjava.net/chengang/archive/2007/08/08/135135.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Wed, 08 Aug 2007 01:01:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/08/08/135135.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/135135.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/08/08/135135.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/135135.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/135135.html</trackback:ping><description><![CDATA[<br>这是RoR 的两本必读书中的一本，两本书都是Dave Thomas的主写的。卓越网（已被亚马逊收购）好象最近购书免邮费，所以我订了一本，原价99，我只花了72元。由于是平邮，一周多后才收到书。800多页的书相当厚实，纸张也很不错。不过由于太厚，现在有从中间撕裂为两半的危险。<br><br>书分四大部份，第一部分讲语法基础，这部分是需要认真读的。这部份写得很细，很不错，需要认真做一些笔记。<br><br>第二部分讲一些较高级的较边缘性的东西，这部分可以快速浏览或跳过。我认真这个部份很多东西都可省去或简化，比如第15章讲irb的根本没必要这么细，谁会经常用irb来写ruby程序呢？而第17章讲GEM库，这对软件产品的打包发行比较重要，却又缺乏可操作性，读来不知所云
。<br><br>第三部分又回到了语法，但更象是第一部份的读书笔记。真搞不懂为什么作者要单独出来成为一大部份，从写作的角度来说，把它里面的新知识点融入到第一部份中会更好。<br><br>第四部分是枯燥的API参考，也是需要重点了解熟悉的，不清楚API还编个什么劲。不过对于英文版的读者来说，这似乎完全没有必要，因为网上有最新<a title="API文档" href="http://www.ruby-doc.org/core/">API文档</a>可查阅，内容基本是一样的。当然对于国内读者来说，这部份翻译成中文还是有价值的，免去了读英文API文档的痛苦。<br><br>如果你有JAVA的基础，书的前三部份可以在四天内读完。不过我觉得第一部份应该多看几遍，而第四部份也需经常通读，今后编程会常常翻查API。 总的来说，这本书对于学习Ruby还是很有用的，关键是翻译得也还不错，读起来牙不酸胃不痛，所以值得一买。<br><br><br><br><br><br><br>    <img src ="http://www.blogjava.net/chengang/aggbug/135135.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-08-08 09:01 <a href="http://www.blogjava.net/chengang/archive/2007/08/08/135135.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用AJAX实现气泡提示</title><link>http://www.blogjava.net/chengang/archive/2007/07/31/133508.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Tue, 31 Jul 2007 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/07/31/133508.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/133508.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/07/31/133508.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/133508.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/133508.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文/陈刚 www.chengang.com.cn （转载请注明）<br><br>这个效果的实现是以网站http://www.panic.com/coda/为模仿对象（选择Download可以看到气泡提示效果），然后重新用Rails中的prototype.js来实现。<br><br>HTML页面的代码：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&lt;span id="content_&lt;%=o.id%&gt;" style="display:none"&gt;<br>&nbsp;&nbsp; &nbsp;<br>&lt;!-- Download Popup style=opacity: 0; visibility: hidden;--&gt; <br>&lt;table style="top:500px; left:600px;" class="popup"&gt;<br>&nbsp; &lt;tbody&gt;<br>&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td class="corner" id="topleft"&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td class="top"&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td class="corner" id="topright"&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td class="left"&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;table class="popup-contents"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tbody&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td&gt;&lt;%=o.content%&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tbody&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/table&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td class="right"&gt;&lt;/td&gt;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td id="bottomleft" class="corner"&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td class="bottom"&gt;&lt;img src="http://www.blogjava.net/images/bubble-tail2.png" alt="popup tail" height="29" width="30"&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;td class="corner" id="bottomright"&gt;&lt;/td&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/tr&gt;<br>&nbsp; &lt;/tbody&gt;<br>&lt;/table&gt;<br>&lt;!-- end download popup --&gt;<br>&lt;/span&gt;<br><br></span><span style="color: #000000;"></span></div>
<br>CSS的代码（涉及到的相关图片：<a href="http://www.blogjava.net/Files/chengang/bubble.rar" title="bubble.rar">bubble.rar</a>）：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;Bubble&nbsp;pop-up&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>.popup&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;position:&nbsp;absolute;<br>&nbsp;&nbsp;&nbsp;&nbsp;z</span><span style="color: #000000;">-</span><span style="color: #000000;">index:&nbsp;</span><span style="color: #000000;">50</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;border</span><span style="color: #000000;">-</span><span style="color: #000000;">collapse:&nbsp;collapse;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">&nbsp;width:500px;<br>&nbsp;&nbsp;&nbsp;&nbsp;visibility:&nbsp;hidden;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>}<br><br>.popup&nbsp;td.corner&nbsp;{height:&nbsp;15px;&nbsp;&nbsp;&nbsp;&nbsp;width:&nbsp;19px;}<br>.popup&nbsp;td#topleft&nbsp;{&nbsp;background</span><span style="color: #000000;">-</span><span style="color: #000000;">image:&nbsp;url(</span><span style="color: #000000;">/</span><span style="color: #000000;">images</span><span style="color: #000000;">/</span><span style="color: #000000;">bubble</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">.png);&nbsp;}<br>.popup&nbsp;td.top&nbsp;{&nbsp;background</span><span style="color: #000000;">-</span><span style="color: #000000;">image:&nbsp;url(</span><span style="color: #000000;">/</span><span style="color: #000000;">images</span><span style="color: #000000;">/</span><span style="color: #000000;">bubble</span><span style="color: #000000;">-</span><span style="color: #000000;">2</span><span style="color: #000000;">.png);&nbsp;}<br>.popup&nbsp;td#topright&nbsp;{&nbsp;background</span><span style="color: #000000;">-</span><span style="color: #000000;">image:&nbsp;url(</span><span style="color: #000000;">/</span><span style="color: #000000;">images</span><span style="color: #000000;">/</span><span style="color: #000000;">bubble</span><span style="color: #000000;">-</span><span style="color: #000000;">3</span><span style="color: #000000;">.png);&nbsp;}<br>.popup&nbsp;td.left&nbsp;{&nbsp;background</span><span style="color: #000000;">-</span><span style="color: #000000;">image:&nbsp;url(</span><span style="color: #000000;">/</span><span style="color: #000000;">images</span><span style="color: #000000;">/</span><span style="color: #000000;">bubble</span><span style="color: #000000;">-</span><span style="color: #000000;">4</span><span style="color: #000000;">.png);&nbsp;}<br>.popup&nbsp;td.right&nbsp;{&nbsp;background</span><span style="color: #000000;">-</span><span style="color: #000000;">image:&nbsp;url(</span><span style="color: #000000;">/</span><span style="color: #000000;">images</span><span style="color: #000000;">/</span><span style="color: #000000;">bubble</span><span style="color: #000000;">-</span><span style="color: #000000;">5</span><span style="color: #000000;">.png);&nbsp;}<br>.popup&nbsp;td#bottomleft&nbsp;{&nbsp;background</span><span style="color: #000000;">-</span><span style="color: #000000;">image:&nbsp;url(</span><span style="color: #000000;">/</span><span style="color: #000000;">images</span><span style="color: #000000;">/</span><span style="color: #000000;">bubble</span><span style="color: #000000;">-</span><span style="color: #000000;">6</span><span style="color: #000000;">.png);&nbsp;}<br>.popup&nbsp;td.bottom&nbsp;{&nbsp;background</span><span style="color: #000000;">-</span><span style="color: #000000;">image:&nbsp;url(</span><span style="color: #000000;">/</span><span style="color: #000000;">images</span><span style="color: #000000;">/</span><span style="color: #000000;">bubble</span><span style="color: #000000;">-</span><span style="color: #000000;">7</span><span style="color: #000000;">.png);&nbsp;text</span><span style="color: #000000;">-</span><span style="color: #000000;">align:&nbsp;center;}<br>.popup&nbsp;td.bottom&nbsp;img&nbsp;{&nbsp;display:&nbsp;block;&nbsp;margin:&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">&nbsp;auto;&nbsp;}<br>.popup&nbsp;td#bottomright&nbsp;{&nbsp;background</span><span style="color: #000000;">-</span><span style="color: #000000;">image:&nbsp;url(</span><span style="color: #000000;">/</span><span style="color: #000000;">images</span><span style="color: #000000;">/</span><span style="color: #000000;">bubble</span><span style="color: #000000;">-</span><span style="color: #000000;">8</span><span style="color: #000000;">.png);&nbsp;}<br><br>.popup&nbsp;table.popup</span><span style="color: #000000;">-</span><span style="color: #000000;">contents&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;font</span><span style="color: #000000;">-</span><span style="color: #000000;">size:&nbsp;12px;<br>&nbsp;&nbsp;&nbsp;&nbsp;line</span><span style="color: #000000;">-</span><span style="color: #000000;">height:&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">.2em;<br>&nbsp;&nbsp;&nbsp;&nbsp;background</span><span style="color: #000000;">-</span><span style="color: #000000;">color:&nbsp;#fff;<br>&nbsp;&nbsp;&nbsp;&nbsp;color:&nbsp;#</span><span style="color: #000000;">666</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;font</span><span style="color: #000000;">-</span><span style="color: #000000;">family:&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Lucida&nbsp;Grande</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Lucida&nbsp;Sans&nbsp;Unicode</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Lucida&nbsp;Sans</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;sans</span><span style="color: #000000;">-</span><span style="color: #000000;">serif;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>table.popup</span><span style="color: #000000;">-</span><span style="color: #000000;">contents&nbsp;th&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;text</span><span style="color: #000000;">-</span><span style="color: #000000;">align:&nbsp;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;text</span><span style="color: #000000;">-</span><span style="color: #000000;">transform:&nbsp;lowercase;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>table.popup</span><span style="color: #000000;">-</span><span style="color: #000000;">contents&nbsp;td&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;text</span><span style="color: #000000;">-</span><span style="color: #000000;">align:&nbsp;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br></span></div>
<br>然后给需要气泡提示的加上鼠标事件：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">span&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">l1</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;onmouseover</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">Element.show('content_&lt;%=o.id%&gt;')</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;onmouseout</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">Element.hide('content_&lt;%=o.id%&gt;')</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;%=</span><span style="color: #000000;">article_link_to(o.title,o.id)</span><span style="color: #000000;">%&gt;&lt;/</span><span style="color: #000000;">span</span><span style="color: #000000;">&gt;</span></div>
<br><br><br>二、继续改进<br>气泡提示的外围HTML表格代码可以改由javascript来动态生成，这样可以缩小一些页面的总HTML大小。<br><br>HTML页面代码改为：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&lt;</span><span style="color: #000000;">span&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">content_&lt;%=o.id%&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;style</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">display:none</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;%=</span><span style="color: #000000;">o.content</span><span style="color: #000000;">%&gt;&lt;/</span><span style="color: #000000;">span</span><span style="color: #000000;">&gt;</span></div>
其他想法：本来打算把文章内容（气泡显示的内容），直接传入javascript函数showPopup里。但由于其字符串较复杂，需要对一些特殊字符进行转义才可以当成字符串传入，而转义需要通写Rails方法来实现，大量的字符搜索替换恐怕会增加服务器的负担。所以这里还是用一个html元素暂存气泡内容。<br><br><br>然后给需要气泡提示的加上鼠标事件。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">span&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">l1</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;onmouseover</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">showPopup('content_&lt;%=o.id%&gt;',event);</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;onmouseout</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">hidePopup()</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;%=</span><span style="color: #000000;">article_link_to(o.title,o.id)</span><span style="color: #000000;">%&gt;&lt;/</span><span style="color: #000000;">span</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span></div>
<br>CSS的代码不变。<br><br>写两个javascript函数：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;showPopup(element_id,event){<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;div&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;createElement(</span><span style="color: #000000;">"</span><span style="color: #000000;">div</span><span style="color: #000000;">"</span><span style="color: #000000;">);&nbsp;&nbsp;<br>&nbsp;&nbsp;div.id&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">popup</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">div.style.display="none";</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;popup&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;$(element_id);<br>&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">取得鼠标的绝对坐标</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;evt&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;event&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;event&nbsp;:&nbsp;(window.event&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;window.event&nbsp;:&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">);&nbsp;&nbsp;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Event.pointerX(evt)</span><span style="color: #000000;">+</span><span style="color: #000000;">5</span><span style="color: #000000;">;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Event.pointerY(evt)</span><span style="color: #000000;">+</span><span style="color: #000000;">5</span><span style="color: #000000;">;<br>&nbsp;&nbsp;div.innerHTML</span><span style="color: #000000;">=</span><span style="color: #000000;">'\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">table&nbsp;style</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">top:'&nbsp;+&nbsp;y&nbsp;+&nbsp;'px;&nbsp;left:'&nbsp;+&nbsp;x&nbsp;+&nbsp;'px;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">popup</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tbody</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">corner</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">topleft</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">top</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">corner</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">topright</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">left</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;&lt;</span><span style="color: #000000;">table&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">popup-contents</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tbody</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">'&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;popup.innerHTML&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;'</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">tbody</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">table</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">right</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">bottomleft</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">corner</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">bottom</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;!--&lt;</span><span style="color: #000000;">img&nbsp;src</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/images/bubble-tail2.png</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;alt</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">popup&nbsp;tail</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;height</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">29</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;width</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">30</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;--&gt;&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">td&nbsp;class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">corner</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">bottomright</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">td</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">tr</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">tbody</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">table</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">';<br>&nbsp;&nbsp;document.body.appendChild(div);<br>&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">Element.show("popup");</span><span style="color: #008000;"><br></span><span style="color: #000000;">}<br><br></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;hidePopup(){<br>&nbsp;&nbsp;Element.remove(</span><span style="color: #000000;">"</span><span style="color: #000000;">popup</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>}<br><br>function createElement(element) {<br>&nbsp;&nbsp;&nbsp; if (typeof document.createElementNS != 'undefined') {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return document.createElementNS('http://www.w3.org/1999/xhtml', element);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; if (typeof document.createElement != 'undefined') {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return document.createElement(element);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return false;<br>}<br><br></span></div>
<br>在javascript中渐显Effect.Appear有一点问题，所以就没再用。<br><br>效果如下图所示：<br><img src="http://www.blogjava.net/images/blogjava_net/chengang/ruby/bubble.png" border="0"><br><br><br><br><br><br>    <img src ="http://www.blogjava.net/chengang/aggbug/133508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-07-31 15:32 <a href="http://www.blogjava.net/chengang/archive/2007/07/31/133508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>rails中使用ajax时的分页实现</title><link>http://www.blogjava.net/chengang/archive/2007/07/30/133396.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Mon, 30 Jul 2007 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/07/30/133396.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/133396.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/07/30/133396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/133396.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/133396.html</trackback:ping><description><![CDATA[关于分页可以参考这篇文章：<a title="http://ruby-lang.org.cn/forums/viewthread.php?tid=206&amp;extra=page%3D1&amp;page=2"  href="http://ruby-lang.org.cn/forums/viewthread.php?tid=206&amp;extra=page%3D1&amp;page=2">http://ruby-lang.org.cn/forums/viewthread.php?tid=206&amp;extra=page%3D1&amp;page=2</a><br><br>但如果使用ajax则分页的实现需要改动一下，如下所示。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;共</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">b</span><span style="color: #000000;">&gt;&lt;%=</span><span style="color: #000000;">@article_pages.page_count</span><span style="color: #000000;">%&gt;&lt;/</span><span style="color: #000000;">b</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">页:</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;%=</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;@article_pages.current</span><span style="color: #000000;">!=</span><span style="color: #000000;">@article_pages.first_page<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_to_remote(</span><span style="color: #000000;">"</span><span style="color: #000000;">首页</span><span style="color: #000000;">"</span><span style="color: #000000;">,:update&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">articleList</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:url&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;{:action&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">list</span><span style="color: #000000;">'</span><span style="color: #000000;">,:subcategory_id&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;@subcategory.id,:page&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;@article_pages.first_page})<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">首页</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end</span><span style="color: #000000;">%&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;%=</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;@article_pages.current.previous<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_to_remote(</span><span style="color: #000000;">"</span><span style="color: #000000;">上一页</span><span style="color: #000000;">"</span><span style="color: #000000;">,:update&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">articleList</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:url&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;{:action&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">list</span><span style="color: #000000;">'</span><span style="color: #000000;">,:subcategory_id&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;@subcategory.id,:page&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;@article_pages.current.previous})<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">上一页</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #000000;">-%&gt;</span><span style="color: #000000;"><br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;%=</span><span style="color: #000000;">pagination_links_each(@article_pages,&nbsp;:window_size&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">do</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;page&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_to_remote(</span><span style="color: #000000;">"</span><span style="color: #000000;">[#{page}]</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;:update&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">articleList</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:url&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;{:action&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">list</span><span style="color: #000000;">'</span><span style="color: #000000;">,:subcategory_id&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;@subcategory.id,:page&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;page})&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end</span><span style="color: #000000;">%&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;%=</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;@article_pages.current.next<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_to_remote(</span><span style="color: #000000;">"</span><span style="color: #000000;">下一页</span><span style="color: #000000;">"</span><span style="color: #000000;">,:update&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">articleList</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:url&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;{:action&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">list</span><span style="color: #000000;">'</span><span style="color: #000000;">,:subcategory_id&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;@subcategory.id,:page&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;@article_pages.current.next})<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">下一页</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;</span><span style="color: #000000;">-%&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;%=</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;@article_pages.current</span><span style="color: #000000;">!=</span><span style="color: #000000;">@article_pages.last_page<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_to_remote(</span><span style="color: #000000;">"</span><span style="color: #000000;">末页</span><span style="color: #000000;">"</span><span style="color: #000000;">,:update&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">articleList</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:url&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;{:action&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">list</span><span style="color: #000000;">'</span><span style="color: #000000;">,:subcategory_id&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;@subcategory.id,:page&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;@article_pages.last_page})<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">末页</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end</span><span style="color: #000000;">%&gt;</span><span style="color: #000000;"><br></span></div>
<br><br>然后再优化一下，把这些代码提取成一个公共函数，放在application_helper里，以便其他页面也能共享。代码如下：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;def&nbsp;ajax_pagination_links(pages,update,url)<br>&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[]<br>&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">共&lt;b&gt;#{pages.page_count}&lt;/b&gt;页</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;links[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;pages.page_count</span><span style="color: #000000;">==</span><span style="color: #000000;">1</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">:&amp;nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;pages.current</span><span style="color: #000000;">!=</span><span style="color: #000000;">pages.first_page<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url[:page]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pages.first_page<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;link_to_remote(</span><span style="color: #000000;">"</span><span style="color: #000000;">首页</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;:update&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;update,&nbsp;:url&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;url)<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">首页</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;pages.current.previous<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url[:page]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pages.current.previous<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;link_to_remote(</span><span style="color: #000000;">"</span><span style="color: #000000;">上一页</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;:update&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;update,&nbsp;:url&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;url)<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">上一页</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;end<br><br>&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;pagination_links_each(pages,&nbsp;:window_size&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">5</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">do</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">page</span><span style="color: #000000;">|</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url[:page]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;page<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_to_remote(</span><span style="color: #000000;">"</span><span style="color: #000000;">[#{page}]</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;:update&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;update,&nbsp;:url&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;url)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;pages.current.next<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url[:page]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pages.current.next<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;link_to_remote(</span><span style="color: #000000;">"</span><span style="color: #000000;">下一页</span><span style="color: #000000;">"</span><span style="color: #000000;">,:update&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;update,&nbsp;:url&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;url)<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">下一页</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;end<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;pages.current</span><span style="color: #000000;">!=</span><span style="color: #000000;">pages.last_page<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url[:page]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pages.last_page<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;link_to_remote(</span><span style="color: #000000;">"</span><span style="color: #000000;">末页</span><span style="color: #000000;">"</span><span style="color: #000000;">,:update&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;update,&nbsp;:url&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;url)<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;links&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">末页</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;links.join(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;end<br></span></div>
<br>以后在页面里只需要加上这样一句即可<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;%=</span><span style="color: #000000;">ajax_pagination_links(@article_pages,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">articleList</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;{:action&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">list</span><span style="color: #000000;">'</span><span style="color: #000000;">,:subcategory_id&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;@subcategory.id})</span><span style="color: #000000;">%&gt;</span></div>
<br><img src ="http://www.blogjava.net/chengang/aggbug/133396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-07-30 17:53 <a href="http://www.blogjava.net/chengang/archive/2007/07/30/133396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[迁移到Linux]   迁移mysql</title><link>http://www.blogjava.net/chengang/archive/2007/06/12/123491.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Mon, 11 Jun 2007 16:33:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/06/12/123491.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/123491.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/06/12/123491.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/123491.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/123491.html</trackback:ping><description><![CDATA[<br>&nbsp; 最近这段时间关于版权的问题，越来越重视了，已经成为国与国之间的大事，必竟这关系于一大笔＄。虽然，我的XP是正版的，但还是考虑迁移到linux上来，并把linux做为今后的工作环境。咱也要争口气，说我盗版，那我不用你的不就成了。我选用的linux版本是ubuntu 7.04，这篇博客就是在新操作系统上写的。<br><br><br>迁移动linux上还是碰到了不少问题，主要还是习惯的问题。虽然ubuntu的桌面环境已经非常不错了，但很多编程方面的软件还是命令行式的，比如mysql。<br><br><br><br><br>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=" utf-8="">
<title></title>
<meta name="GENERATOR" content="OpenOffice.org 2.2  (Linux)">
<meta name="AUTHOR" content="chen">
<meta name="CREATED" content="20070607;11354700">
<meta name="CHANGEDBY" content="chen">
<meta name="CHANGED" content="20070612;295500">
<style type="text/css">
<!--
@page { size: 21cm 29.7cm; margin: 2cm }
P { margin-bottom: 0.21cm }
H3 { margin-bottom: 0.21cm }
H3.western { font-family: "Helvetica" }
H3.cjk { font-family: "STHeiti"; font-style: normal }
H3.ctl { font-family: "STHeiti" }
-->
</style>
<h3 class="cjk">安装<font face="Helvetica">MySQL</font></h3>
<p><br><br>
</p>
<p><font face="STHeiti, serif">sudo apt-get install mysql-server
mysql-client</font></p>
<br>
<p><font face="STHeiti, serif"><strong>root</strong></font><strong>原密码为空，给它加个密码</strong></p>
<p><font face="STHeiti, serif">mysqladmin -uroot -password 123456
</font></p>
<br>
<p style="margin-bottom: 0cm;"><strong>导入</strong><font face="STHeiti, serif"><strong>SQL</strong></font><strong>脚本</strong></p>
<p style="margin-bottom: 0cm;"><font face="STHeiti, serif">mysql
-uroot -p123456 &lt; db/create_table.sql </font>
</p>
<p style="margin-bottom: 0cm;"><br>
</p>
<p style="margin-bottom: 0cm;"><strong>重启动</strong><font face="STHeiti, serif"><strong>mysql</strong></font><strong>服务</strong><font face="STHeiti, serif"><br>mysqladmin
-uroot -p123456 shutdown<br>sudo mysqld&amp;</font></p>
<p style="margin-bottom: 0cm;"><font face="STHeiti, serif"><br></font><strong>中文乱码的解决</strong><font face="STHeiti, serif"><br></font>修改<font face="STHeiti, serif">mysql</font>配置文件<font face="STHeiti, serif"><br>sudo
vim /etc/mysql/my.cnf</font></p>
<p style="margin-bottom: 0cm;">增加红色一句</p>
<p style="margin-bottom: 0cm;"><font face="STHeiti, serif">datadir
= /var/lib/mysql
</font></p>
<p style="margin-bottom: 0cm;"><font face="STHeiti, serif">tmpdir
= /tmp
</font></p>
<p style="margin-bottom: 0cm;"><font face="STHeiti, serif">language
= /usr/share/mysql/english
</font></p>
<p style="margin-bottom: 0cm;"><font color="#ff0000"><font face="STHeiti, serif"><strong>default-character-set
= utf8
</strong></font></font></p>
<p style="margin-bottom: 0cm;"><font face="STHeiti, serif">skip-external-locking
</font></p>
<p style="margin-bottom: 0cm;"><br>
</p>
<p style="margin-bottom: 0cm;">现象：在用命令行导入建表与插入数据的脚本后，所得数据还是乱码。但在<font face="STHeiti, serif">RadRails</font>中用<font face="STHeiti, serif">insert</font>插入数据却中文显示正常，看来是<font face="STHeiti, serif">mysql</font>命令行客户端的原因。在<font face="STHeiti, serif">SQL</font>脚本头加上如下一句，可以让<font face="STHeiti, serif">mysql</font>命令行客户端识别编码，正常导入中文。</p>
<p style="margin-bottom: 0cm;"> <font face="STHeiti, serif"><font color="#ff0000"><strong>SET
NAMES 'utf8';
</strong></font></font></p>
<br><br><br>mysql的GUI客户端可以使用mysql官方的mysql-query-browser。在ubuntu的新立得管理器里可以装。<br><br> <img src ="http://www.blogjava.net/chengang/aggbug/123491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-06-12 00:33 <a href="http://www.blogjava.net/chengang/archive/2007/06/12/123491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ruby on Rails笔记_v0.1</title><link>http://www.blogjava.net/chengang/archive/2007/05/13/117075.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Sat, 12 May 2007 16:46:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/05/13/117075.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/117075.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/05/13/117075.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/117075.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/117075.html</trackback:ping><description><![CDATA[<p>&#8220;读不如做，做不如写&#8221;，这一直是我学习技术所喜欢的方式。我是一个健忘的人，把知识写成文章后，自己遗忘时查阅也就方便了很多，毕竟是自己写的东西一查就能记起大部份来。此文档（PDF格式）
是我学习Ruby on Rails技术的综合，有读书笔记、有心得、有自创教程、有一些问题的解决经验，统统分门别类集合在了一起。由于时间仓促，所以有些地方写得很简略，排版有些乱，错误肯定也不少。寄希望于以后不断更新此文档，争取更完善起来。
</p>
<br><br>Ruby on Rails笔记，下载：&nbsp; <a href="http://www.blogjava.net/Files/chengang/ror_v0.1.rar" title="Ruby on Rails心得 V0.1">V0.1</a> 、 &nbsp; <a href="http://www.blogjava.net/Files/chengang/ror_v0.2.rar" title="Ruby on Rails笔记 V0.2">V0.2</a><br><br><br><br>    <img src ="http://www.blogjava.net/chengang/aggbug/117075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-05-13 00:46 <a href="http://www.blogjava.net/chengang/archive/2007/05/13/117075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rails学习笔记（7）实现分页，及数据库模型命名限制</title><link>http://www.blogjava.net/chengang/archive/2007/05/08/116053.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Tue, 08 May 2007 14:09:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/05/08/116053.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/116053.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/05/08/116053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/116053.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/116053.html</trackback:ping><description><![CDATA[Rails的分页实在是简单到了极点。一个文章列表的分页是这样实现的。<br><br>先在Action使用paginate方法，如下。<br>其中得到的数据记录会在@articles变量里，页的信息在@article_pages变量里。<br>paginate方法的第一参数是数据表名，order_by根据id排倒序，conditions是查询条件，per_page是每页三条记录。<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;@article_pages,@articles&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;paginate(:articles,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:order_by&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">id&nbsp;DESC</span><span style="color: #000000;">'</span><span style="color: #000000;">,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:conditions&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">user_id=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;user_id,&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:per_page&nbsp;</span><span style="color: #000000;">=&gt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">)<br></span></div>
<br>接着在页面里就可以把@articles变量里的记录显示出来，而在*.rhtml文件里显示分页的那一栏的代码为<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&lt;%=</span><span style="color: #000000;">&nbsp;pagination_links(@article_pages)</span><span style="color: #000000;">%&gt;</span></div>
<br>缺点是分页栏的式样固定，只列出了页码，没有列出上一页、下一页这样的翻页的按钮。不过，研究一下pagination_links方法的源代码，自己仿造写一个应该很简单。<br><br><br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br><br>今天还碰到一个问题，我把表titles改名为modules后，模型文件名为module.rb，其他部份也做了修改。运行后出了错，出错信息是Module.class没有find方法（我在action调用find方法）。如下：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;NoMethodError&nbsp;in&nbsp;SiteController#index<br><br>undefined&nbsp;method&nbsp;`find</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;for&nbsp;Module:Class</span><span style="color: #000000;"><br></span><span style="color: #000000;"><br>RAILS_ROOT:&nbsp;.</span><span style="color: #000000;">/</span><span style="color: #000000;">script</span><span style="color: #000000;">/</span><span style="color: #000000;">..</span><span style="color: #000000;">/</span><span style="color: #000000;">config</span><span style="color: #000000;">/</span><span style="color: #000000;">..<br>Application&nbsp;Trace&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;Framework&nbsp;Trace&nbsp;</span><span style="color: #000000;">|</span><span style="color: #000000;">&nbsp;Full&nbsp;Trace<br><br>#{RAILS_ROOT}</span><span style="color: #000000;">/</span><span style="color: #000000;">app</span><span style="color: #000000;">/</span><span style="color: #000000;">controllers</span><span style="color: #000000;">/</span><span style="color: #000000;">site_controller.rb:</span><span style="color: #000000;">21</span><span style="color: #000000;">:in&nbsp;`header</span><span style="color: #000000;">'<br></span><span style="color: #000000;">#{RAILS_ROOT}</span><span style="color: #000000;">/</span><span style="color: #000000;">app</span><span style="color: #000000;">/</span><span style="color: #000000;">controllers</span><span style="color: #000000;">/</span><span style="color: #000000;">site_controller.rb:</span><span style="color: #000000;">5</span><span style="color: #000000;">:in&nbsp;`index</span><span style="color: #000000;">'<br></span><span style="color: #000000;">-</span><span style="color: #000000;">e:</span><span style="color: #000000;">4</span><span style="color: #000000;">:in&nbsp;`load</span><span style="color: #000000;">'<br></span><span style="color: #000000;">-</span><span style="color: #000000;">e:</span><span style="color: #000000;">4</span><span style="color: #000000;"><br></span><span style="color: #000000;"><br></span></div>
<br>多方尝试后发现数据库模型类不允许起名为module（这应该是rails内部的一个类，或者是rails是一个关键字），最后的解决办法是加一个下划线后缀，然后用set_table_name指定映射的表名。文件名：module_.rb<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Module_&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;ActiveRecord::Base<br>&nbsp;&nbsp;set_table_name&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">modules</span><span style="color: #000000;">"</span><span style="color: #000000;"><br></span><span style="color: #000000;"></span><span style="color: #000000;">end<br></span></div>
<br><br> <img src ="http://www.blogjava.net/chengang/aggbug/116053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-05-08 22:09 <a href="http://www.blogjava.net/chengang/archive/2007/05/08/116053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XHTML+CSS (2) 一个通用页面框架</title><link>http://www.blogjava.net/chengang/archive/2007/04/19/111895.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Thu, 19 Apr 2007 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/04/19/111895.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/111895.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/04/19/111895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/111895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/111895.html</trackback:ping><description><![CDATA[<br>每个页面都可以用的XHTML模板(扩展点为*.html)：<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;html&nbsp;PUBLIC&nbsp;"-//W3C//DTD&nbsp;XHTML&nbsp;1.0&nbsp;Transitional//EN"&nbsp;"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">html&nbsp;</span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">meta&nbsp;</span><span style="color: #ff0000;">http-equiv</span><span style="color: #0000ff;">="Content-Type"</span><span style="color: #ff0000;">&nbsp;content</span><span style="color: #0000ff;">="text/html;&nbsp;charset=gb2312"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">子在川上曰</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">title</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">link&nbsp;</span><span style="color: #ff0000;">href</span><span style="color: #0000ff;">="main.css"</span><span style="color: #ff0000;">&nbsp;rel</span><span style="color: #0000ff;">="stylesheet"</span><span style="color: #ff0000;">&nbsp;type</span><span style="color: #0000ff;">="text/css"</span><span style="color: #ff0000;">&nbsp;media</span><span style="color: #0000ff;">="screen"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">head</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;<br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。。。。。。。。主页内容<br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">body</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">html</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span></div>
<br>用DIV+CSS来排版，的确要比过去表格方式利于维护。一般的方式是用DIV搭出页面骨架，然后用CSS慢慢润饰。看了<a title="《禅意花园》" href="http://www.csszengarden.com/tr/chinese/">《禅意花园》</a>的读试第一章，再去它的网站看了看，这是它的原始页面：<a href="http://www.csszengarden.com/tr/chinese/">http://www.csszengarden.com/tr/chinese/</a>。禅意花园提供了固定的XHTML文档结构，而各设计师可以基于此文档设计出CSS能改变页面风格，这些页面风格很出彩：<a href="http://www.mezzoblue.com/zengarden/alldesigns/">http://www.mezzoblue.com/zengarden/alldesigns/</a>，从中可见CSS的页面修饰能力强到超出我们想像。<br><br>我也简单用DIV+CSS写了一个简单的页面框架：<a href="http://www.blogjava.net/Files/chengang/xhtml_css_demo.rar">http://www.blogjava.net/Files/chengang/xhtml_css_demo.rar</a>。这个DEMO在IE7下显示正常，在FireFox3下则有点问题。但用Amaya检查，没有发现格式错误。有高手懂的帮指出一下。<br><br>补：<br>li列表在FF3下显示出圆点的解决，加式样：list-style:none;
<br><img src ="http://www.blogjava.net/chengang/aggbug/111895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-04-19 13:22 <a href="http://www.blogjava.net/chengang/archive/2007/04/19/111895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rails学习笔记（6）中文乱码的解决</title><link>http://www.blogjava.net/chengang/archive/2007/04/19/111867.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Thu, 19 Apr 2007 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/04/19/111867.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/111867.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/04/19/111867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/111867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/111867.html</trackback:ping><description><![CDATA[<p>环境：<br>。MySQL 5.0，MySQL的环境配置为UTF8，建表也全部使用UTF8。<br>。IE6.0、FireFox 2.0.2<br>。Ruby 1.8.5　+　rails 1.2.3<br></p>
<p>错误现象：<br>。用MySQL Query Browser查看MySQL数据，中文显示正常。<br>。页面显示为乱码，原来是中文的地方都变成了一个长方块<br>。手工调整浏览器的页面编码，可以使用页面正常显示。但刷新后又是乱码。<br><br>解决方法：修改config/database.yml，加入一句编码设置如下。</p>
<p>&#160;</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">development:<br>&nbsp;&nbsp;adapter:&nbsp;mysql<br>&nbsp;&nbsp;database:&nbsp;chensite_development<br>&nbsp;&nbsp;<span style="color: red;">encoding:&nbsp;utf8</span><br>&nbsp;&nbsp;username:&nbsp;root<br>&nbsp;&nbsp;password:&nbsp;</span><span style="color: #000000;">123456</span><span style="color: #000000;"><br>&nbsp;&nbsp;host:&nbsp;localhost</span></div>
<br>
<p>&#160;</p>
<p>这时从数据库读取的数据显示正常了，但*.rhtml里的原中文却显示变成了乱码。据说将*.rhtml用记事本重新保存为utf-8格式可以解决，而我是用Radrails，右击项目，在它的属性页的info项的text file encoding改为UTF-8。这时*.rhtml文件里的中文会变成乱码，所以最好备份一下，然后将备份的文件内容一个个的复制粘贴过来。致此终于完美解决了中文乱码问题。</p>
<br>
<p>注：</p>
<p>1。有些文章说要修改application.rb，在before_filter加入字符过滤代码。我以前也试过，可行。但我觉得还是修改database.yml来得简单一些。</p>
<br>2。有些文章说要同时在*.rhtml里加上如下编码设置。我发现这一句可加可不加，对页面编码显示没有任何影响。
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">meta&nbsp;http</span><span style="color: #000000;">-</span><span style="color: #000000;">equiv</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">Content-type</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;content</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">text/html;&nbsp;charset=utf-8</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span></div>
<p><br>3。还有的人说修改environment.rb加入两行　$KCODE = 'u'　和　require 'jcode' 。这里似乎没有必要。也许这是老版Rails的解决方法。</p>
<p>&#160;</p>
4。有的人说在建表的时候不能用InnoDB，但我的建表语句如下，是用InnoDB。没有发现问题。<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">create&nbsp;table&nbsp;modules&nbsp;(<br>&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;auto_increment,<br>&nbsp;..........</span><span style="color: #000000;"><br>&nbsp;expanded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tinyint(</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">default</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">,<br>&nbsp;primary&nbsp;key&nbsp;(id)<br>)ENGINE</span><span style="color: #000000;">=</span><span style="color: #000000;">InnoDB&nbsp;DEFAULT&nbsp;CHARSET</span><span style="color: #000000;">=</span><span style="color: #000000;">utf8;</span></div>
<br><img src ="http://www.blogjava.net/chengang/aggbug/111867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-04-19 11:41 <a href="http://www.blogjava.net/chengang/archive/2007/04/19/111867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rails学习笔记（5）第6、7、8章摘要</title><link>http://www.blogjava.net/chengang/archive/2007/04/10/109408.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Tue, 10 Apr 2007 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/04/10/109408.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/109408.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/04/10/109408.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/109408.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/109408.html</trackback:ping><description><![CDATA[创建一个项目：rails depot<br><br>执行SQL脚本：mysql depot_development &lt; db/create.sql<br>创建三个库，分别用于开发、测试、生产：depot_development、depot_test、depot_production。<br>每个表都应该带一个和业务无关的ID字段。<br>在rails配置数据库的连接：config\database.yml。密码之前冒号之后要间隔一个空格。<br><br>ruby script/generate scaffold Product Admin，针对Product表产生一整套的网页程序（增删改），Admin是控制器名<br>ruby script/generate controller Store index&nbsp;&nbsp; 创建一个名为Store的控制器，并含有一个index() Action方法。<br><br><br>启动WEB服务：ruby script/server。（<a href="http://localhost:3000/admin">http://localhost:3000/admin</a> ）<br><br><br>模型类：<br>。validates_presence_of&nbsp; :title, :desc, :image_url&nbsp;&nbsp; 必须不为空<br>。validates_numericality_of :price　　必须是数字<br>。validates_uniqueness_of&nbsp;&nbsp; :title&nbsp; 　必须唯一<br>。validates_format_of&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :image_url, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :with&nbsp;&nbsp;&nbsp; =&gt; %r{^http:.+\.(gif|jpg|png)$}i,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :message =&gt; "must be a URL for a GIF, JPG, or PNG image"　　文件名必须是图片文件的扩展名<br>。模型保存到数据库之前会调用validate方法，例：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;def&nbsp;validate<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;errors.add(:price,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">should&nbsp;be&nbsp;positive</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;unless&nbsp;price.nil</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;price&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.0</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;end</span></div>
<br><br><br>ActiveRecord的方法属性：<br>。content_columns　得到所有字段。content_columns.name字段名<br>。日期在今天之前，按日期倒序排列。self表示它是一个类方法（静态方法）。
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;def&nbsp;self.salable_items<br>&nbsp;&nbsp;&nbsp;&nbsp;find(:all,&nbsp;:conditions&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">date_available&nbsp;&lt;=&nbsp;now()</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;:order&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">date_available&nbsp;desc</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;end</span></div>
<br><br>以下为链接，效果相当于以前的&#8220;<a href="http://..../show.jsp?id=11">http://..../show.jsp?id=11</a>&#8221;<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;link_to&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Show</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;:action&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">show</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;:id&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;product&nbsp;</span><span style="COLOR: #000000">%&gt;&lt;</span><span style="COLOR: #000000">br</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;link_to&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Edit</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;:action&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">edit</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;:id&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;product&nbsp;</span><span style="COLOR: #000000">%&gt;&lt;</span><span style="COLOR: #000000">br</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;link_to&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Destroy</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;{&nbsp;:action&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">destroy</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;:id&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;product&nbsp;},&nbsp;:confirm&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Are&nbsp;you&nbsp;sure?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">%&gt;</span></div>
<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;@product_pages.current.previous&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_to(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Previous&nbsp;page</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;{&nbsp;:page&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;@product_pages.current.previous&nbsp;})<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br></span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;@product_pages.current.next&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;link_to(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Next&nbsp;page</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;{&nbsp;:page&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;@product_pages.current.next&nbsp;})<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br></span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br></span></div>
<br><br>truncate(product.desciption, 80)&nbsp; 显示产品描述字段的摘要（80个字符）<br>product.date_available.strftime("%y-%m-%d")　日期字段的格式化显示<br>sprintf("%0.2f",&nbsp;product.price)　数值的格式化显示, number_to_currency方法也有类似功能<br><br>public/stylesheets&nbsp;目录保存了网页所用的CSS式样表。用ruby script/generate scaffold ....生成框架代码的网页自动使用scaffold.css<br><br><br>布局模板<br>。app/views/layouts目录中创建一个与控制器同名的模板文件store.rhtml，则控制器下所有网页都会使用此模板<br>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">html</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">head</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">title</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">Pragprog&nbsp;Books&nbsp;Online&nbsp;Store</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">title</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;stylesheet_link_tag&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">scaffold</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">depot</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;:media&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">all</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">head</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">body</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">div&nbsp;id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">banner</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">img&nbsp;src</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/images/logo.png</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;@page_title&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Pragmatic&nbsp;Bookshelf</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">div</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">div&nbsp;id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">columns</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">div&nbsp;id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">side</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">a&nbsp;href</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www<img src="http://www.blogjava.net/Images/dot.gif">.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">Home</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">br&nbsp;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">a&nbsp;href</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www<img src="http://www.blogjava.net/Images/dot.gif">./faq</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">Questions</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">br&nbsp;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">a&nbsp;href</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www<img src="http://www.blogjava.net/Images/dot.gif">./news</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">News</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">br&nbsp;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">a&nbsp;href</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://www<img src="http://www.blogjava.net/Images/dot.gif">./contact</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">Contact</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">a</span><span style="COLOR: #000000">&gt;&lt;</span><span style="COLOR: #000000">br&nbsp;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">div</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">div&nbsp;id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">main</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;@flash[:notice]&nbsp;</span><span style="COLOR: #000000">-%&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">div&nbsp;id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">notice</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;&lt;%=</span><span style="COLOR: #000000">&nbsp;@flash[:notice]&nbsp;</span><span style="COLOR: #000000">%&gt;&lt;/</span><span style="COLOR: #000000">div</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">&nbsp;end&nbsp;</span><span style="COLOR: #000000">-%&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;@content_for_layout&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">div</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">div</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">body</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">html</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span></div>
<p><span style="COLOR: #000000">。&lt;%=</span><span style="COLOR: #000000">&nbsp;stylesheet_link_tag&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">scaffold</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">depot</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;:media&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">all</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">%&gt;生成指向<span style="COLOR: #000000">scaffold.css、<span style="COLOR: #000000">depot.css两<span style="COLOR: #000000">个式样表的&lt;link&gt;标签<br>。<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#46;&#64;&#112;&#97;&#103;&#101;&#95;&#116;&#105;&#116;&#108;&#101;">@page_title</a>&nbsp;各个页面标题变量<br><span style="COLOR: #0000ff">。<span style="COLOR: #000000">@flash[:notice]&nbsp;提示性的信息（key=notice），这是一个公共变量。</span><br></span><span style="COLOR: #000000">。&lt;%=</span><span style="COLOR: #000000">&nbsp;@content_for_layout&nbsp;</span><span style="COLOR: #000000">%&gt;　位置嵌入显示控制器内名网页。由于其他网页变成了模板的一部份，所以其&lt;html&gt;等标签应该去掉。</span></span></span></span></span></p>
<p><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #000000"><span style="COLOR: #000000"><br><br>store_controller.rb ，当从session里取出某购物车不存在，则新建一个，并存入session。最后把此购物车赋给变量cart。<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;def&nbsp;find_cart<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;@cart&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(session[:cart]&nbsp;</span><span style="COLOR: #000000">||=</span><span style="COLOR: #000000">&nbsp;Cart.</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;end<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<p><br>ruby&nbsp; script/generate&nbsp; model&nbsp; LineItem，创建一个LineItem的数据模型，附带还会创建相应的测试程序。<br><br>store_controller.rb：<br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&nbsp;&nbsp;def&nbsp;add_to_cart<br>&nbsp;&nbsp;&nbsp;&nbsp;product&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Product.find(params[:id])<br>&nbsp;&nbsp;&nbsp;&nbsp;@cart.add_product(product)<br>&nbsp;&nbsp;&nbsp;&nbsp;redirect_to(:action&nbsp;</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">display_cart</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;rescue<br>&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Attempt&nbsp;to&nbsp;access&nbsp;invalid&nbsp;product&nbsp;#{params[:id]}</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;redirect_to_index(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">Invalid&nbsp;product</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;end</span></div>
<p>。params是URL的参数数组<br>。redirect_to转向语句<br>。rescue　异常，相当于Java的Exception<br>。redirect_to_index是application.rb中的一个方法，这个文件里的方法是各控制器公开的。<br>。logger是rails内置的变量。<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
<p><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Cart<br><br>&nbsp;&nbsp;attr_reader&nbsp;:items<br></span><span style="COLOR: #000000">&nbsp;&nbsp;attr_reader&nbsp;:total_price<br>&nbsp;&nbsp;<br></span><span style="COLOR: #000000">&nbsp;&nbsp;def&nbsp;initialize<br>&nbsp;&nbsp;&nbsp;&nbsp;empty</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;end<br><br></span><span style="COLOR: #000000">&nbsp;&nbsp;def&nbsp;add_product(product)<br>&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;@items.find&nbsp;{</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">i</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;i.product_id&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;product.id}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;item<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item.quantity&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;LineItem.for_product(product)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class Cart</span></p>
<p><span style="COLOR: #000000">&nbsp; # An array of LineItem objects<br>&nbsp; attr_reader :items</span></p>
<p><span style="COLOR: #000000">&nbsp; # The total price of everything added to this cart<br>&nbsp; attr_reader :total_price<br>&nbsp; <br>&nbsp; # Create a new shopping cart. Delegates this work to #empty!<br>&nbsp; def initialize<br>&nbsp;&nbsp;&nbsp; empty!<br>&nbsp; end</span></p>
<p><span style="COLOR: #000000">&nbsp; # Add a product to our list of items. If an item already<br>&nbsp; # exists for that product, increase the quantity<br>&nbsp; # for that item rather than adding a new item.<br>&nbsp; def add_product(product)<br>&nbsp;&nbsp;&nbsp; item = @items.find {|i| i.product_id == product.id}<br>&nbsp;&nbsp;&nbsp; if item<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item.quantity += 1<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item = LineItem.for_product(product)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @items &lt;&lt; item<br>&nbsp;&nbsp;&nbsp; end<br>&nbsp;&nbsp;&nbsp; @total_price += product.price<br>&nbsp; end</span></p>
<p><span style="COLOR: #000000">&nbsp; # Empty the cart by resetting the list of items<br>&nbsp; # and zeroing the current total price.<br>&nbsp; def empty!<br>&nbsp;&nbsp;&nbsp; @items = []<br>&nbsp;&nbsp;&nbsp; @total_price = 0.0<br>&nbsp; end<br>end </span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;@total_price&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;product.price<br>&nbsp;&nbsp;end<br><br>&nbsp;&nbsp;def&nbsp;empty</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;@items&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;[]<br>&nbsp;&nbsp;&nbsp;&nbsp;@total_price&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.0</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;end<br>end&nbsp;</span></p>
</div>
<p><br>。由于Cart没有对应的数据表，它只是一个普通的数据类，因此要定义相应的属性。<br>。@items &lt;&lt; item　把对象item加入到@items数组<br>。@items=[]&nbsp;&nbsp; 空数组<br><br><br>如果出现SessionRestoreError错误，则检查application.rb是否做了如下的模型声明。因为对于动态语句，session把序列化的类取出时，否则是无法知道对象类型的，除非声明一下。</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;ApplicationController&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;ActionController::Base<br>&nbsp;&nbsp;model&nbsp;:cart<br>&nbsp;&nbsp;model&nbsp;:line_item<br>end<br></span></div>
<p><br>&lt;%&nbsp; ... -%&gt;　　-%&gt;相当于一个换行符</p>
<p><br>@items.find(|i| i.product_id == product.id)&nbsp; |i|的作用应该相当于@items数组中的一个元素（书上没有提到，要查一下ruby语法）。</p>
<p><br>if @items.empty?　　　判断数组是否为空数组</p>
<p>flash[:notice]　flash可以在同一个Session的下一个请求中使用，随后这些内容就会被自动删除（下一个的下一个就被清空了？？）。<br>实例变量是代替不了flash的，因为IE无状态的特性，在下一个请求中，上一个请求的实例变量已失效。</p>
<p><br>当异常没有被任何程序捕捉，最后总会转到ApplicationController的rescue_action_in_public()方法</p>
<p><br>各视图可以使用appp/helpers目录下的各自相应的辅助程序中提供的方法。</p>
<p>&nbsp;</p>
</span></span></span></span>
<img src ="http://www.blogjava.net/chengang/aggbug/109408.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-04-10 09:47 <a href="http://www.blogjava.net/chengang/archive/2007/04/10/109408.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rails学习笔记（4）数据库配置及页面读取</title><link>http://www.blogjava.net/chengang/archive/2007/04/09/109255.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Mon, 09 Apr 2007 06:36:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/04/09/109255.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/109255.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/04/09/109255.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/109255.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/109255.html</trackback:ping><description><![CDATA[<p>开始在MySQL中创建数据库，分别用于：开发、测试、产品</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">create&nbsp;database&nbsp;chensite_development;<br>create&nbsp;database&nbsp;chensite_test;<br>create&nbsp;database&nbsp;chensite_production;</span></div>
<br>在开发库中建表和插入数据：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">use&nbsp;chensite_development;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>drop&nbsp;table&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;exists&nbsp;titles;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>create&nbsp;table&nbsp;titles&nbsp;(<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;auto_increment,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">)&nbsp;&nbsp;not&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;url&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;varchar(</span><span style="COLOR: #000000">200</span><span style="COLOR: #000000">)&nbsp;&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">&nbsp;NULL,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;parent_id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;expanded&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tinyint(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;level&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tinyint(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;primary&nbsp;key&nbsp;(id)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>)ENGINE</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">InnoDB&nbsp;DEFAULT&nbsp;CHARSET</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">utf8;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>LOCK&nbsp;TABLES&nbsp;titles&nbsp;WRITE;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>INSERT&nbsp;INTO&nbsp;titles&nbsp;VALUES(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">AAAAAAAAA</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">http:\\www.AAAAAAAAA.com.cn</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>INSERT&nbsp;INTO&nbsp;titles&nbsp;VALUES(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">BBBBBBBBB</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">http:\\www.BBBBBBBBB.com.cn</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>INSERT&nbsp;INTO&nbsp;titles&nbsp;VALUES(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">CCCCCCCCC</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">http:\\www.CCCCCCCCC.com.cn</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>INSERT&nbsp;INTO&nbsp;titles&nbsp;VALUES(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">关于</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">http:\\www.DDDDDDDDD.com.cn</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>INSERT&nbsp;INTO&nbsp;titles&nbsp;VALUES(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">EEEEEEEEE</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">http:\\www.EEEEEEEEE.com.cn</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>INSERT&nbsp;INTO&nbsp;titles&nbsp;VALUES(</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">FFFFFFFFF</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">http:\\www.FFFFFFFFF.com.cn</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>INSERT&nbsp;INTO&nbsp;titles&nbsp;VALUES(</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">GGGGGGGGG</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">http:\\www.GGGGGGGGG.com.cn</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>INSERT&nbsp;INTO&nbsp;titles&nbsp;VALUES(</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">HHHHHHHHH</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">http:\\www.HHHHHHHHH.com.cn</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>UNLOCK&nbsp;TABLES;</span></div>
<br>配置数据库连接:&nbsp; config\database.yml，主要是给连接三个数据库的root用户输入密码，在输入密码时要注意<span style="COLOR: red">："password:"和密码"123456"之间要有一个空格</span>，密码之后不要有空格，否则无法启动WEB服务。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#&nbsp;MySQL&nbsp;(</span><span style="COLOR: #0000ff">default</span><span style="COLOR: #000000">&nbsp;setup).&nbsp;&nbsp;Versions&nbsp;</span><span style="COLOR: #000000">4.1</span><span style="COLOR: #000000">&nbsp;and&nbsp;</span><span style="COLOR: #000000">5.0</span><span style="COLOR: #000000">&nbsp;are&nbsp;recommended.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;Install&nbsp;the&nbsp;MySQL&nbsp;driver:<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;gem&nbsp;install&nbsp;mysql<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;On&nbsp;MacOS&nbsp;X:<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;gem&nbsp;install&nbsp;mysql&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">include</span><span style="COLOR: #000000">=/</span><span style="COLOR: #000000">usr</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">local</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">lib<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;On&nbsp;Windows:<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;gem&nbsp;install&nbsp;mysql<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Choose&nbsp;the&nbsp;win32&nbsp;build.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Install&nbsp;MySQL&nbsp;and&nbsp;put&nbsp;its&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">bin&nbsp;directory&nbsp;on&nbsp;your&nbsp;path.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;And&nbsp;be&nbsp;sure&nbsp;to&nbsp;use&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">style&nbsp;password&nbsp;hashing:<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;&nbsp;&nbsp;http:</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">dev.mysql.com/doc/refman/5.0/en/old-client.html</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">development:<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;adapter:&nbsp;mysql<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;database:&nbsp;chensite_development<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;username:&nbsp;root<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;password:&nbsp;</span><span style="COLOR: #000000">123456</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;host:&nbsp;localhost<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;Warning:&nbsp;The&nbsp;database&nbsp;defined&nbsp;as&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">test</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;will&nbsp;be&nbsp;erased&nbsp;and<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;re</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">generated&nbsp;from&nbsp;your&nbsp;development&nbsp;database&nbsp;when&nbsp;you&nbsp;run&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">rake</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>#&nbsp;Do&nbsp;not&nbsp;set&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">&nbsp;db&nbsp;to&nbsp;the&nbsp;same&nbsp;as&nbsp;development&nbsp;or&nbsp;production.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>test:<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;adapter:&nbsp;mysql<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;database:&nbsp;chensite_test<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;username:&nbsp;root<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;password:&nbsp;</span><span style="COLOR: #000000">123456</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;host:&nbsp;localhost<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>production:<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;adapter:&nbsp;mysql<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;database:&nbsp;chensite_production<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;username:&nbsp;root<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;password:&nbsp;</span><span style="COLOR: #000000">123456</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;host:&nbsp;localhost<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>接下来创建一个能够显示数据库数据的页面。Rails是MVC模式的编程方式。<br>首先创建数据模型：app\models\title.rb<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Title&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;ActiveRecord::Base<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>end</span></div>
<ul>
    <li>数据库titles（小写复数），文件名title.rb（小写单数），类名Title（大写单数）
    <li>大写方式－－单词第一个字母为大写。小写方式－－每个单词用下划线分开。
    <li>模型类中不必定义属性，它会自动以数据库字段为属性。
    <li>set_table_name "table1" 定义对应的表
    <li>set_primary_key "name"　改默认的ID主键为name，不过以后name字段就用成id，如：o.id="chengang"</li>
</ul>
<p>创建视图：views\homepage\index.rhtml，显示出title表所有记录的id和name值</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">html</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">body</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">h1</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">ChenGang</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">s&nbsp;Site&lt;/h1&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;title&nbsp;in&nbsp;@titles&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;title.id&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000">__</span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;title.name&nbsp;</span><span style="COLOR: #000000">%&gt;&lt;</span><span style="COLOR: #000000">br</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;%</span><span style="COLOR: #000000">&nbsp;end&nbsp;</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">body</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">html</span><span style="COLOR: #000000">&gt;</span></div>
<p>视图中用到的@titles变量来自于我们自己创建的如下控制器: app\controllers\homepage_controller.rb。Rails中控制器中的变量可以在视图中使用（这是否会产生变量污染的问题呢，还待以后再体验）</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;HomepageController&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;ApplicationController<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;def&nbsp;index<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;@titles&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Title.find(:all)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;end<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>end<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<ul>
    <li>Homepage和视图的目录名homepage相关
    <li>index方法和视图的文件名index.rhtml相关
    <li>用index可以省略访问地址中的action（action默认为index action) </li>
</ul>
<p>最后启动Web服务器后访问：<a href="http://localhost:3000/homepage">http://localhost:3000/homepage</a>　<br></p>
<p>&nbsp;<br></p>
<img src ="http://www.blogjava.net/chengang/aggbug/109255.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-04-09 14:36 <a href="http://www.blogjava.net/chengang/archive/2007/04/09/109255.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rails学习笔记（3）前四章摘记</title><link>http://www.blogjava.net/chengang/archive/2007/04/06/108997.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Fri, 06 Apr 2007 11:10:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/04/06/108997.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/108997.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/04/06/108997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/108997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/108997.html</trackback:ping><description><![CDATA[把《应用Rails..》从头再看了一遍，下面是第一部份（前4章）的笔记<br><br>下载Ruby的网址：http://rubyinstaller.rubyforge.org　　检查：ruby -v<br>安装Rails的命令：gem install rails -include-dependencies　要注意网络通畅。<br>更新Rails的命令: gem update rails<br>创建一个名为chensite的项目，命令：rails chensite<br>启动内建的WEB服务器，先进入chensite目录，再输入命令：ruby script/server，访问http://localhost:3000<br><br>－－－－－－－－－－－－－－－－－－－－－－－<br>书中都是用文本编辑器来编辑代码，其实用RadRails这个IDE（Eclipse插件）更方便。<br>RadRails下载：http://radrails.sourceforge.net，我用的是radrails-0.7.1-win32.zip，解压后就可以用了。<br>下面讲一下它的配置，主要是在首选项窗口里设置。另注：除了配置ruby.exe有扩展名以外, 其他设定都没有扩展名。 <br><br><img height=289 alt="" src="http://www.blogjava.net/images/blogjava_net/chengang/ruby/020070406_image001.jpg" width=447> <br>Mongrel是WEB服务器，这里可不设置。一般是用Apache做前端请求转发，后端用mongrel做集群，以实现大负荷访问。<br><img src="http://www.blogjava.net/images/blogjava_net/chengang/ruby/020070406_image002.jpg" border=0><br><img src="http://www.blogjava.net/images/blogjava_net/chengang/ruby/020070406_image003.jpg" border=0> <br><br><br>在Eclipse右下角的Server视图可以启动WEB服务器。<br>创建一个Controller，在书中是这个命令：ruby script/generate controller say <br>Eclipse中的方式则如下图所示：<br><img src="http://www.blogjava.net/images/blogjava_net/chengang/ruby/020070406_image004.jpg" border=0> <br><br>在Eclipse中没有专门用于rhtml文件的新建项，以普通文件方式创建即可。不过，提供RHTML的编辑器，内含代码完成助手（Content Assist），代码提示功能不强，只会提示一些基本的语法流程框架，没有象JAVA编辑器那种类的方法的提示。<br><br><br>创建一个say控制器后，将say_controller.rb类如下<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;SayController&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;ApplicationController<br>&nbsp;&nbsp;def&nbsp;hello<br>&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">chengang&nbsp;of&nbsp;puts</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;@blogsite</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">www.chengang.com.cn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.downto(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;&nbsp;</span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">count</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;&nbsp;#每次减1，从3循环到1&nbsp;（</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">、</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">、1共三次循环）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;count<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">#{count}&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;@blogsite<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;end<br>end<br></span></div>
<br>hello相当于一个Action，不过要显示WEB页面（http://localhost:3000/say/hello ）还需要在一个rhtml文件：views/say/hello.rhtml<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">html</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">head</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">title</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">Hello,Rails</span><span style="COLOR: #000000">!&lt;</span><span style="COLOR: #000000">title</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">head</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">body</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">h1</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">Hello&nbsp;from&nbsp;Rails</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">h1</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">Time.now</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">br</span><span style="COLOR: #000000">/&gt;&lt;!--</span><span style="COLOR: #000000">now方法不用括号</span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">@blogsite</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;!--</span><span style="COLOR: #000000">可以直接使用SayController中的变量</span><span style="COLOR: #000000">--&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;%=</span><span style="COLOR: #000000">&nbsp;link_to&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">bye&nbsp;bye</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;:action</span><span style="COLOR: #000000">=&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">goodbye</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">body</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">html</span><span style="COLOR: #000000">&gt;</span></div>
<br>。link_to除了action，还可以定义controller，以及action的参数<br>。link_to "About", :controller=&gt;"showpage", :action=&gt;"about", :id=&gt;11&nbsp; 则生成的url为 <a href="http://.../showpage/about/11">http://.../showpage/about/11</a><br>。如果把上一个的id改为... :name=&gt;"glchengang" ，则生成的url为<a href='http://.../showpage/about?name="glchengang'>http://.../showpage/about?name="glchengang</a>"。和前一个url比较得知id是默认参数，不显示。<br><br>&lt;%=Time.now%&gt;　显示当前时间<br>&nbsp;<!--now方法不用括号--><br>h()方法用于输出包含%&lt;&gt;等字符<br><br>1.hour.from_now　从现在过去1小时后的时间。数字也是一个对象，也具有方法。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.times&nbsp;</span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000">　　＃三次循环<br>　　puts&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">chengang</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br>end</span></div>
<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #000000">3</span><span style="COLOR: #000000">.downto(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">count</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;＃每次减1，从3循环到1&nbsp;。共三次循环，count是变量<br>　　puts&nbsp;count<br>end</span></div>
<br><br>&lt;%= link_to "bye bye", :action=&gt;"goodbye"%&gt;　一个指向当前控制器say的goodbye这个Action的链接<br><br><br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br><a href="http://www.blogjava.net/">www.blogjava.net</a>对FirFox支持不太好，在编辑文章复制粘贴时，平白弹出一个窗口，多出了两步麻烦的操作。<br>
<img src ="http://www.blogjava.net/chengang/aggbug/108997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-04-06 19:10 <a href="http://www.blogjava.net/chengang/archive/2007/04/06/108997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rails学习笔记（2）</title><link>http://www.blogjava.net/chengang/archive/2007/04/05/108644.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Thu, 05 Apr 2007 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/04/05/108644.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/108644.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/04/05/108644.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/108644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/108644.html</trackback:ping><description><![CDATA[用两周时间看完了《应用Rails进行敏捷WEB开发》的前15章，对其ActiveRecord的功能是感觉相当震憾的。ActiveRecord是Rails的数据模型层，其功能和Hibernate类似，不过在开发上前者简单了很多，ActiveRecord功能强大，代码量却少得惊人。我觉得搞JAVA开发的人都应该看看Rails，即使不用Rails来进行实际开发，也有很多设计思想可以借鉴。当然，Rails中很多功能和简洁的使用方式，Java是实现不来的，这也是动态脚本和静态编译的不同。15章之后就边做边看吧，实践中才能体会更深。<br><br>《应用Rails...》是好书，翻译得不错。不过也有瑕疵，比如书上总出现&#8220;引用原书第＊＊＊页的＊＊＊&#8221;，晕！难道还要去找原书来翻翻。这种低级错误和译者无关，译者交书稿时未经过排版，所以是无法确定下页码的。而出版商的编辑在排版完成后，本应该交作者再核对修改，但这一道工序似乎被省去了。<br>　<br>过去几年我大都是做后台，前台则是用SWT写胖客户端。离开WEB已经很久了，WEB的新技术出得很多，AJAX是其中一个比较重要的。买了一本《Ajax基础教程》看了一章都没甚么看明白Ajax是个什么样子，去榕湖图书馆借了本《征服Ajax+Lucene构建搜索引擎》，这回知道什么是Ajax了，其核心很简单就是XMLHTTPRequest的使用，主要知识面在JavaScript和XML。《征服Ajax...》这书深度不行，注水的内容太多，如果会JavaScript和XML，这本书关于Ajax的近200页中，只有约20页的内容对是有用的。现在很多AJAX框架，书中一个都没讲到，看完这本书，你还是无法在实际项目中使用Ajax的，因为自已去写基础Javascript代码太累了，谁还会去重新发明轮子呢？lucene和Ajax没什么相关技术被纠合在一起写，不明白作者是怎么想的。如果能把Lucene去掉，加入一些经典AJAX效果的实例，并深入介绍一个较酷的AJAX框架，和一些JavaScript调试开发工具，我想那一定会成为一本极好的书。<br><br>去JavaEye查了一下，AJAX的框架很多，让人不知如何选择。我看到其中YUI-EXT框架做出来的界面效果相当棒，可以考虑用它。但Rails内置了一些AJAX框架，所以需要以后再比较一下。<br><br>YUI－EXT的几个效果DEMO：<br>http://extjs.com/deploy/ext/examples/grid/edit-grid.html<br>http://yui-ext.com/deploy/yui-ext/examples/tree/two-trees.html<br>http://yui-ext.com/playpen/yui-ext.0.40/examples/dialog/msg-box.html<br> <img src ="http://www.blogjava.net/chengang/aggbug/108644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-04-05 11:08 <a href="http://www.blogjava.net/chengang/archive/2007/04/05/108644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rails学习笔记（1）</title><link>http://www.blogjava.net/chengang/archive/2007/03/25/106244.html</link><dc:creator>陈刚</dc:creator><author>陈刚</author><pubDate>Sun, 25 Mar 2007 08:53:00 GMT</pubDate><guid>http://www.blogjava.net/chengang/archive/2007/03/25/106244.html</guid><wfw:comment>http://www.blogjava.net/chengang/comments/106244.html</wfw:comment><comments>http://www.blogjava.net/chengang/archive/2007/03/25/106244.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chengang/comments/commentRss/106244.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chengang/services/trackbacks/106244.html</trackback:ping><description><![CDATA[最近要做一个网站，考虑再三选择用Rails，选择的原因是它被一致推崇的可维护性和开发效率。对一个有多年经验的开发者来说，可维护性和开发效率的重要性高于程序执行效率。有了C语言，还有谁去用汇编呢，有了C＋＋还有谁去用C呢，有了Java了谁还去用CGI开发网页呢，有了Rails中小规模的网站谁还去用Java呢？不过，学习Rails对我来说是一个挑战。人将老矣，尚能学否？心里没谱。<br /><br />我的学习书籍是《应用Rails进行敏捷Web开发》<br /><br />首先碰到的问题是书中的源代码下不了，原来给出的网址不让中国的IP下载（有岐视？），于是用google搜索到 <a class="nav" href="http://www.railscn.com/index.php">Ruby On Rails 中文社区论坛</a>，找到了源代码包。地址为（需要注册登录到论坛才能看到附件）：<br /><a href="http://www.railscn.com/viewtopic.php?t=3258&amp;highlight=%D3%A6%D3%C3Rails%BD%F8%D0%D0%C3%F4%BD%DD">http://www.railscn.com/viewtopic.php?t=3258&amp;highlight=%D3%A6%D3%C3Rails%BD%F8%D0%D0%C3%F4%BD%DD</a><br />　<br /><br /><br />P54页，在创建数据库时要注意，如果你是才装的MySQL那么只有一个root用户，所以不要执行P54页的grant语句，否则会出错。grant语句是将数据库授权给某用户。而且第三句grant，如把prod改成root后执行，会把root用户的密码更改为wibble，导致旧密码失效，并且网页执行出“#28000Access denied for user <a href="mailto:'root'@'localhost'">'root'@'localhost'</a> (using password: YES)”错误。所以最好在学习阶段就用root用户得了，三条grant语句都不要执行。当然图6.1所示的配置文件也改为用root和相应的密码。<br /><br /><br /><br />看到P74页，越来越感觉到开发Rails的速度是如此之快，真是非常简单方便。但ruby语句比较古灵精怪，我折回到附录A快速浏览了一遍，还是有些地方不太明白。不管这么多先，照猫画虎把购物车完成先。<br /><br /><img src ="http://www.blogjava.net/chengang/aggbug/106244.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chengang/" target="_blank">陈刚</a> 2007-03-25 16:53 <a href="http://www.blogjava.net/chengang/archive/2007/03/25/106244.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>