在方法中,Block是新作用域,而控制结构还是方法的作用域.
def foo
while true #控制结构</p>
<pre><code>i = 10
break
</code></pre>
<p> end
puts i #正常输出10</p>
<p> [1].map{ j = 100 }
puts j #undefined local variable 错误
end</p>
<p>foo
在方法中,Block是新作用域,而控制结构还是方法的作用域.
def foo
while true #控制结构</p>
<pre><code>i = 10
break
</code></pre>
<p> end
puts i #正常输出10</p>
<p> [1].map{ j = 100 }
puts j #undefined local variable 错误
end</p>
<p>foo
只是写出自己觉得不错的看点,供新手参考. 由ApplicationController统一include LoginSystem module. 代码放在目录vendor/plugins/typo_login_system
小技巧一: vendor/plugins/typo_login_system/lib/login_system.rb
def self.included(base)
base.send :helper_method, :current_user, :logged_in?
end
小技巧二:
def current_user</p>
<pre><code>@current_user ||= (login_from_session || login_from_basic_auth || login_from_cookie || :false)
</code></pre>
<p> end
Typo::AccessControl的实现有点复杂,它是yield的常用手法的一个实现
授权基本角色,权限控制细粒度到controller,无法控制到action
从vendor/plugins/typo_login_system/lib/access_control.rb 文件的注释示例进行简单的分析.
类方法map需要传一个Hash,:require的值可以是数组或字符串,这里写角色名,每调用一次类方法,会生成一个Mapper实例,yield后,再把Mapper实例保存到@mappers
而@mappers运行时是唯一的,所以当你多次调用类方法map,把它其生成的所有Mapper实例都保存到@mappers这个数组里.
Mapper数据结构::
Mapper
--roles
--controllers
--project_modules
--controllers
验证是否可以有权限
通过@mappers拿到包含指定role name的所有Mapper实例,把mapper的controllers和其拥有的所有project_modules的controllers合并成一个数组,判断访问的控制器名是否在此数组里
Typo的角色权限定义可以看config/initializers/access_rules.rb
功能不是很强大,但满意一般的小应用场合.
选择Typo作为学习目标.原因有三点:
从安装分析起.我也是半吊子,写的不好,请多多指教.
安装路径是/setup,Controller是Setup,从此Controller的RSpec可以看出,进行setup操作,数据库里需要有一条Blog数据,不然会报错的.
GET setup时,会调用ApplicationController的this_blog方法. this_blog方法默认拿到Blog的第一条记录
POST setup用的是同一个方法,用http method来区分,提交表单用post. 成功后会重定向到 /setup/confirm
此操作应该会生成一个用户,和初始化博客设置.
汗,貌似我在翻译Typo的RSpec.Stop,看到觉得不错的再分享.
text_field的placeholder属性挺不错的,输入提示用的,获取到光标时自动隐藏.不过是HTML5特性
generate_password方法用的upto,其实times实现更优美.
1.upto(7) { |i| newpass << chars[rand(chars.size-1)] }
7.times { newpass << chars[rand(chars.size-1)] }