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

<channel>
	<title>里克的自习室 &#187; acts_as_taggable</title>
	<atom:link href="http://railser.cn/blog/tag/acts_as_taggable/feed" rel="self" type="application/rss+xml" />
	<link>http://railser.cn</link>
	<description>关注Ruby和Rails的学习与开发</description>
	<lastBuildDate>Tue, 20 Dec 2011 11:47:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>开发笔记：rails分页和acts_as_taggable插件的应用[重发]</title>
		<link>http://railser.cn/blog/development-log-rails-pagnate-and-acts-as-taggable</link>
		<comments>http://railser.cn/blog/development-log-rails-pagnate-and-acts-as-taggable#comments</comments>
		<pubDate>Thu, 18 Dec 2008 16:15:41 +0000</pubDate>
		<dc:creator>里克</dc:creator>
				<category><![CDATA[RailsNote]]></category>
		<category><![CDATA[acts_as_taggable]]></category>

		<guid isPermaLink="false">http://railser.cn/archives/development-log-rails-pagnate-and-acts-as-taggable</guid>
		<description><![CDATA[最近一个月在忙于开发项目，所以没有更新博客。不过开发中还是学到不少东西。 对于一个程序员，阅读是相当有帮助的，读别人的博客，读源码，读经验文章 ，即便读别人的开发代码，都是有帮助的。 本次开发的初始，就是在读别人的开发代码，然后一点点找到思路，继续在原有基础上加强功能。由于上一个版本的代码写的相当有水准，所以对自己的开发也提高不少。 本次开发的项目是一个在线视频教学系统。开发中用到了曾经写过的分页代码和一个rails插件：acts_as_taggable。 下面对这两个部分进行总结。 一、分页 下面的程序在3个项目上使用过。 models/page.rb class Page attr_accessor :pages #分页连接列表，[]类型 attr_accessor :cur #当前页 end helpers/application_helper.rb def howtopage_links&#40;pagecls=nil&#41; #在页面输出分页连接，pagecls:分页实例 if pagecls return pagecls.pages.collect &#123;&#124;t&#124; &#91;if t.to_s == pagecls.cur &#34;&#60;a class=&#34;now&#34; href=&#34;http://railser.cn/wp-admin/?page=#%7Bt.to_s%7D&#34;&#62;&#34;+(t.to_s)+&#34;&#60;/a&#62;&#34; else &#34;&#60;a href=&#34;http://railser.cn/wp-admin/?page=#%7Bt.to_s%7D&#34;&#62;&#34;+(t.to_s)+&#34;&#60;/a&#62;&#34; end&#93; &#125; end end controllers/application.rb def howtopage&#40;totalcount=0, per_page=6&#41; cur_page = params&#91;:page&#93; &#124;&#124; 1 #直接从页面取得page变量 x = &#40;cur_page.to_i - [...]]]></description>
			<content:encoded><![CDATA[<pre><script type="text/javascript"><!--mce:0--></script>
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"><!--mce:1--></script></pre>
<p>最近一个月在忙于开发项目，所以没有更新博客。不过开发中还是学到不少东西。</p>
<p>对于一个程序员，阅读是相当有帮助的，读别人的博客，读源码，读经验文章 ，即便读别人的开发代码，都是有帮助的。</p>
<p>本次开发的初始，就是在读别人的开发代码，然后一点点找到思路，继续在原有基础上加强功能。由于上一个版本的代码写的相当有水准，所以对自己的开发也提高不少。</p>
<p>本次开发的项目是一个在线视频教学系统。开发中用到了曾经写过的分页代码和一个rails插件：acts_as_taggable。</p>
<p>下面对这两个部分进行总结。</p>
<h3>一、分页</h3>
<p>下面的程序在3个项目上使用过。<br />
models/page.rb</p>
<blockquote>
<pre class="ruby"><span style="color:#9966CC; font-weight:bold;">class</span> Page
  attr_accessor <span style="color:#ff3333; font-weight:bold;">:pages</span> <span style="color:#008000; font-style:italic;">#分页连接列表，[]类型</span>
  attr_accessor <span style="color:#ff3333; font-weight:bold;">:cur</span> <span style="color:#008000; font-style:italic;">#当前页</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre>
</blockquote>
<p>helpers/application_helper.rb</p>
<blockquote>
<pre class="ruby">  <span style="color:#9966CC; font-weight:bold;">def</span> howtopage_links<span style="color:#006600; font-weight:bold;">&#40;</span>pagecls=<span style="color:#0000FF; font-weight:bold;">nil</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;">#在页面输出分页连接，pagecls:分页实例</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> pagecls
      <span style="color:#0000FF; font-weight:bold;">return</span> pagecls.<span style="color:#9900CC;">pages</span>.<span style="color:#9900CC;">collect</span> <span style="color:#006600; font-weight:bold;">&#123;</span>|t|
      <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#9966CC; font-weight:bold;">if</span> t.<span style="color:#9900CC;">to_s</span> == pagecls.<span style="color:#9900CC;">cur</span>
        <span style="color:#996600;">&quot;&lt;a class=&quot;</span>now<span style="color:#996600;">&quot; href=&quot;</span>http://railser.<span style="color:#9900CC;">cn</span>/wp-admin/?page=<span style="color:#008000; font-style:italic;">#%7Bt.to_s%7D&quot;&gt;&quot;+(t.to_s)+&quot;&lt;/a&gt;&quot;</span>
      <span style="color:#9966CC; font-weight:bold;">else</span>
        <span style="color:#996600;">&quot;&lt;a href=&quot;</span>http://railser.<span style="color:#9900CC;">cn</span>/wp-admin/?page=<span style="color:#008000; font-style:italic;">#%7Bt.to_s%7D&quot;&gt;&quot;+(t.to_s)+&quot;&lt;/a&gt;&quot;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre>
</blockquote>
<p>controllers/application.rb</p>
<blockquote>
<pre class="ruby">  <span style="color:#9966CC; font-weight:bold;">def</span> howtopage<span style="color:#006600; font-weight:bold;">&#40;</span>totalcount=<span style="color:#006666;">0</span>, per_page=<span style="color:#006666;">6</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    cur_page = params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:page</span><span style="color:#006600; font-weight:bold;">&#93;</span> || <span style="color:#006666;">1</span> <span style="color:#008000; font-style:italic;">#直接从页面取得page变量</span>
    x = <span style="color:#006600; font-weight:bold;">&#40;</span>cur_page.<span style="color:#9900CC;">to_i</span> - <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span> * per_page
    pagecount = totalcount / per_page
    <span style="color:#9966CC; font-weight:bold;">if</span> totalcount % per_page != <span style="color:#006666;">0</span>
      pagecount += <span style="color:#006666;">1</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    page = Page.<span style="color:#9900CC;">new</span>
    page.<span style="color:#9900CC;">pages</span> = <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span>..<span style="color:#9900CC;">pagecount</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">collect</span>
    page.<span style="color:#9900CC;">cur</span> = params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:page</span><span style="color:#006600; font-weight:bold;">&#93;</span> || <span style="color:#996600;">&quot;1&quot;</span>
    <span style="color:#0000FF; font-weight:bold;">return</span> page, x <span style="color:#008000; font-style:italic;">#page为一个包装的分页类，x为find方法的偏移量</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre>
</blockquote>
<p>在一个notebook_controller.rb中</p>
<blockquote>
<pre class="ruby"><span style="color:#0066ff; font-weight:bold;">@notes_count</span> = Notebook.<span style="color:#9900CC;">count</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:conditions</span>=&amp;gt;<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'user_id = ?'</span>, params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'user_id'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
per_page = <span style="color:#006666;">6</span> <span style="color:#008000; font-style:italic;">#每页记录数</span>
<span style="color:#0066ff; font-weight:bold;">@page</span>, x = howtopage<span style="color:#006600; font-weight:bold;">&#40;</span>@notes_count, per_page<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#0066ff; font-weight:bold;">@notes</span> = Notebook.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span>, <span style="color:#ff3333; font-weight:bold;">:conditions</span>=&amp;gt;<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'user_id = ?'</span>, params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'user_id'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span>,
 <span style="color:#ff3333; font-weight:bold;">:order</span>=&amp;gt;<span style="color:#996600;">&quot;id desc&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:offset</span>=&amp;gt;x, <span style="color:#ff3333; font-weight:bold;">:limit</span>=&amp;gt;per_page<span style="color:#006600; font-weight:bold;">&#41;</span></pre>
</blockquote>
<p>在对应的页面中</p>
<blockquote>
<pre class="ruby">&amp;lt; %=howtopage_links<span style="color:#006600; font-weight:bold;">&#40;</span>@page<span style="color:#006600; font-weight:bold;">&#41;</span>%&amp;gt;</pre>
</blockquote>
<p>这段方法有很多可以改进的地方，但是能用就好。<br />
不过这个分页绝对算是ruby和rails入门的练习，如果想使用更专业的分页，还是推荐will_paginate插件。可以通过下面的方法安装：<br />
script/plugin install svn://errtheblog.com/svn/plugins/will_paginate<br />
介绍页面：<a href="http://errtheblog.com/posts/56-im-paginating-again">http://errtheblog.com/posts/56-im-paginating-again</a></p>
<p>08年12月19日补充：</p>
<p>这篇博客是去年12月2日写的，一年的时间足够改变世界了。现在这个插件的地址在：http://github.com/mislav/will_paginate/tree/master</p>
<h3>二、acts_as_taggable</h3>
<p>虽然标题写的是acts_as_taggable，但是首先要说明，我用的是acts_as_taggable_on_steroids，可以通过下面的方法进行安装：<br />
ruby script/plugin install</p>
<p>http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids</p>
<blockquote><p>注意不同之处：<br />
在<a href="http://www.slashdotdash.net/articles/2006/04/29/acts_as_taggable-per-user-tagging"> acts_as_taggable per user tagging</a>篇提到：also an acts_as_taggable的gem安装和plugin安装结果是不一样的. acts_as_taggable的plugin仅适用与Rails 1.1.<br />
里克：其实上面写这句话的人是针对不同版本的，仅供参考。</p>
<p>所以，选择哪个tag插件，需要注意下。不同的插件使用的方法是不一样的。DDH的acts_as_taggable<a href="http://taggable.rubyforge.org/">文档</a>是关于那个插件的，它可以通过<br />
svn co http://dev.rubyonrails.com/svn/rails/plugins/legacy/acts_as_taggable/ acts_as_taggable<br />
获得。目前看也仅能从这里获得。</p></blockquote>
<p>非常详细的适用方法请看<a href="http://agilewebdevelopment.com/plugins/acts_as_taggable_on_steroids">Plugins - Acts As Taggable On Steroids</a></p>
<h3>其他Rails插件</h3>
<p>本部分被转移到 <a href="http://railser.cn/archives/mephistoblog-vender-and-plugins">MephistoBlog使用的插件和第三方代码介绍</a></p>
<p>参考资料：<br />
<a href="http://taggable.rubyforge.org/">RDoc</a><br />
<a href="http://wiki.rubyonrails.org/rails/pages/Acts+As+Taggable+Plugin">Acts As Taggable Plugin</a><br />
<a href="http://wiki.rubyonrails.org/rails/pages/ActsAsTaggablePluginHowto">ActsAsTaggablePluginHowto</a><br />
<a href="http://agilewebdevelopment.com/plugins/acts_as_taggable_on_steroids">Plugins - Acts As Taggable On Steroids</a><br />
<a href="http://www.slashdotdash.net/articles/2006/04/29/acts_as_taggable-per-user-tagging"> 为每个用户曾加tag功能[acts_as_taggable per user tagging]</a><br />
<a href="http://baike.baidu.com/view/15482.htm">ASCII</a><br />
<a href="http://rubylib.cn/">Ruby Lib中文站</a></p>
]]></content:encoded>
			<wfw:commentRss>http://railser.cn/blog/development-log-rails-pagnate-and-acts-as-taggable/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

