<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[曹小华的博客]]></title>
  <link href="http://www.mangege.com/atom.xml" rel="self"/>
  <link href="http://www.mangege.com/"/>
  <updated>2012-02-14T22:14:34+08:00</updated>
  <id>http://www.mangege.com/</id>
  <author>
    <name><![CDATA[曹小华]]></name>
  </author>

  
  <entry>
    <title type="html"><![CDATA[Rails学习笔记之Typo登陆认证与授权]]></title>
    <link href="http://www.mangege.com//2012/02/14/railsxue-xi-bi-ji-zhi-typodeng-lu-ren-zheng-yu-shou-quan.html"/>
    <updated>2012-02-14T20:06:00+08:00</updated>
    <id>http://www.mangege.com//2012/02/14/railsxue-xi-bi-ji-zhi-typodeng-lu-ren-zheng-yu-shou-quan</id>
    <content type="html"><![CDATA[<p>只是写出自己觉得不错的看点,供新手参考.
由ApplicationController统一include LoginSystem module.
代码放在目录vendor/plugins/typo_login_system</p>

<p>小技巧一:
vendor/plugins/typo_login_system/lib/login_system.rb</p>

<div class="highlight"><pre><code class="ruby">  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">included</span><span class="p">(</span><span class="n">base</span><span class="p">)</span>
  <span class="n">base</span><span class="o">.</span><span class="n">send</span> <span class="ss">:helper_method</span><span class="p">,</span> <span class="ss">:current_user</span><span class="p">,</span> <span class="ss">:logged_in?</span>
  <span class="k">end</span>
</code></pre>
</div>


<p>利用include module的回调方法included,把current_user, logged_in?添加到helper,这样在view也可以调用这两个方法
另外它的login_form_系列方法的实现也很值得看.</p>

<p>小技巧二:</p>

<div class="highlight"><pre><code class="ruby">  <span class="k">def</span> <span class="nf">current_user</span>
    <span class="vi">@current_user</span> <span class="o">||=</span> <span class="p">(</span><span class="n">login_from_session</span> <span class="o">||</span> <span class="n">login_from_basic_auth</span> <span class="o">||</span> <span class="n">login_from_cookie</span> <span class="o">||</span> <span class="ss">:false</span><span class="p">)</span>
  <span class="k">end</span>
</code></pre>
</div>


<p>利用 ||= ,把当前用户保存到实例变量@current_user中,这样控制器实例第二次调用的时候,就不需要再运行后面的代码.</p>

<p>Typo::AccessControl的实现有点复杂,它是yield的常用手法的一个实现<br/>
授权基本角色,权限控制细粒度到controller,无法控制到action<br/>
从vendor/plugins/typo_login_system/lib/access_control.rb 文件的注释示例进行简单的分析.<br/>
类方法map需要传一个Hash,:require的值可以是数组或字符串,这里写角色名,每调用一次类方法,会生成一个Mapper实例,yield后,再把Mapper实例保存到@mappers<br/>
而@mappers运行时是唯一的,所以当你多次调用类方法map,把它其生成的所有Mapper实例都保存到@mappers这个数组里.</p>

<p>Mapper数据结构::<br/>
Mapper<br/>
&nbsp;&nbsp;--roles<br/>
&nbsp;&nbsp;--controllers<br/>
&nbsp;&nbsp;--project_modules<br/>
&nbsp;&nbsp;&nbsp;&nbsp;--controllers</p>

<p>验证是否可以有权限<br/>
通过@mappers拿到包含指定role name的所有Mapper实例,把mapper的controllers和其拥有的所有project_modules的controllers合并成一个数组,判断访问的控制器名是否在此数组里</p>

<p>Typo的角色权限定义可以看config/initializers/access_rules.rb</p>

<p>功能不是很强大,但满意一般的小应用场合.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rails学习笔记之Typo安装]]></title>
    <link href="http://www.mangege.com//2012/02/09/railsxue-xi-zhi-typoan-zhuang.html"/>
    <updated>2012-02-09T15:53:00+08:00</updated>
    <id>http://www.mangege.com//2012/02/09/railsxue-xi-zhi-typoan-zhuang</id>
    <content type="html"><![CDATA[<p>选择Typo作为学习目标.原因有三点:</p>

<ol>
<li>更像我们平常开发的Rails应用,对Rails动刀的地方不多,容易看懂.</li>
<li>博客项目,复杂度相对来说比较简单,功能也不少.</li>
<li>有测试,分析起来很轻松.</li>
</ol>


<p>从安装分析起.我也是半吊子,写的不好,请多多指教.<br/>
安装路径是/setup,Controller是Setup,从此Controller的RSpec可以看出,进行setup操作,数据库里需要有一条Blog数据,不然会报错的.</p>

<p>GET setup时,会调用ApplicationController的this_blog方法. this_blog方法默认拿到Blog的第一条记录<br/>
POST setup用的是同一个方法,用http method来区分,提交表单用post. 成功后会重定向到 /setup/confirm<br/>
此操作应该会生成一个用户,和初始化博客设置.</p>

<p>汗,貌似我在翻译Typo的RSpec.Stop,看到觉得不错的再分享.</p>

<p>text_field的placeholder属性挺不错的,输入提示用的,获取到光标时自动隐藏.不过是HTML5特性</p>

<p>generate_password方法用的upto,其实times实现更优美.</p>

<div class="highlight"><pre><code class="ruby"><span class="mi">1</span><span class="o">.</span><span class="n">upto</span><span class="p">(</span><span class="mi">7</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span> <span class="n">newpass</span> <span class="o">&lt;&lt;</span> <span class="n">chars</span><span class="o">[</span><span class="nb">rand</span><span class="p">(</span><span class="n">chars</span><span class="o">.</span><span class="n">size</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">]</span> <span class="p">}</span> 
</code></pre>
</div>


<p>新</p>

<div class="highlight"><pre><code class="ruby"><span class="mi">7</span><span class="o">.</span><span class="n">times</span> <span class="p">{</span> <span class="n">newpass</span> <span class="o">&lt;&lt;</span> <span class="n">chars</span><span class="o">[</span><span class="nb">rand</span><span class="p">(</span><span class="n">chars</span><span class="o">.</span><span class="n">size</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">]</span> <span class="p">}</span> 
</code></pre>
</div>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[博客有新家了]]></title>
    <link href="http://www.mangege.com//2012/01/01/bo-ke-you-xin-jia-liao.html"/>
    <updated>2012-01-01T22:52:00+08:00</updated>
    <id>http://www.mangege.com//2012/01/01/bo-ke-you-xin-jia-liao</id>
    <content type="html"><![CDATA[<p>重新为自己的博客启用独立域名,其实一两年前用WordPress写过博客,但由于换空间以当时的技术觉得迁移数据麻烦,就转到iteye.</p>

<p>经朋友介绍了解了Jekyll,觉得挺不错的.有以下几点好处:</p>

<ol>
<li>不需要数据库,数据直接保存为文件,管理可以用版本软件,存到免费的代码托管. 如githu, google code.</li>
<li>可以直接把页面托管到git pages,不需要自己维护主机,还支持绑定域名. 我的博客现在就托管要github pages,你可以用ping命令验证一下.</li>
<li>够简单,写文章的时候直接用vim,还支持markdown等标识语言.</li>
</ol>


<p>对我来说主要有这三个优点,缺点也是有的.</p>

<ol>
<li>熟悉Jekyll的功能需要一定时间,以前用的都是基于界面录入的,换成生成页面的有些思维还真没有转换过来.</li>
<li>模板写起来有点麻烦,用的是 Liquid 模板引擎,需要熟悉.</li>
<li>很多功能都要写插件, 比如文章摘要,分类列表页生成. 不过这些功能 octopress 都已经实现了,可以直接参考.</li>
<li>搜索只能依赖第三方搜索,用google的site参数.</li>
</ol>


<p>这些缺点随着时间的推移和个人学习进步,有些反而会变成优点.<br/>
这一次,不管什么原因,都不需要再搬家了.</p>
]]></content>
  </entry>
  
</feed>

