Agile Web Development with Rails 翻译(二十四)
Agile Web Development with Rails 翻译(二十四)
登出
我们的管理布局在侧边拦有一个logou选项。这在login controller中的实现是很简单的。
def logout
session[:user_id] = nil
flash[:notice] = "Logged out"
redirect_to(:action => "login")
end
我们最后一次叫来我们的客户,她用了一会儿store应用程序。她试用了我们新的管理功能,并检查了买方的体验。她尝试输入错误数据,应用程序处理的非常漂亮。她笑了,那么我们基本上完成了。
我们已经完成了增加功能。但是在我们离开前我们再看一看代码。我们注意到store controller中一个稍有点丑的重复代码。每个动作除了index的动作都需要在session数据中寻找用户的购物车。这行代码是
@cart = find_cart
它在controller中出现了5次。现在我们知道filter可以修补它。我们改变了find_cart()方法来将其结果直接保存到@cart实例变量中。
def find_cart
@cart = (session[:cart] ||= Cart.new)
end
我们将使用一个before 过滤器来在除了index的所有动作中调用这个方法。
before_filter :find_cart, :except => :index
这使我们移去动作方法中5个对@cart的赋值。最终清单显示在491页中。
11.4 Finishing Up
编码结束了,但是在我们将应用程序部署到产品前我们仍然要做一些整理工作。
我们也许需要检查我们应用的文档。当我们编码时,我们已经为我们所有的类和方法写了一些简单雅致的注释(将代码抽取到本书时由于想节约空间我们没有显示它们)。Rails使得对应用的所有源文件运行Ruby的RDoc工具来创建好看的程序员文档十分容易。但是,在我们生成这样的文档前,我们可以创建一个很好的介绍页以便以后的开发者理解我们应用是干什么的。为了实现这一点,编辑文件doc/README_FOR_APP,并键入任何你觉得有用的东西。该文件将被RDoc处理,因此你有很大的格式灵活性。
你可以用rake命令来生成HTML格式的文档。
depot> rake appdoc
它生成的文档被置于目录doc/app。图11.1显示了生成的初始页面
11.5 More Icing on the Cake
尽管写我们自己的login代码很有趣,但我们在此过程中学习了许多Rails知识。在实际项目中我们也许会采用不同的方法。
Rails的generator可以被扩展--人们可以为其它用途创建新的生成器。如果你看附录,你会看到至少2个现成的login controllers,都比我们刚刚写的那个有更多功能。试验它们要比创建你自己的用户管理系统要更谨慎一些。
如果你决定创建你自己的login controller,你也许会对一个由Erik Hatcher所建议的简单技巧感兴趣。我们所写的authorize()方法在任何进来的请求之前被调用。它是否应该决定如果用户不登录,它就直接定向到login行为?
Erik建议扩展它,让它在重定向到登陆页面前在session中保存request参数。
def authorize
unless session[:user_id]
flash[:notice] = "Please log in"
# save the URL the user requested so we can hop back to it
# after login
session[:jumpto] = request.parameters
redirect_to(:controller => "login", :action => "login")
end
end
这样,一旦登陆成功了,在重定向中使用保存的参数来让浏览器回到用户最初想访问的页面。
def login
if request.get?
session[:user_id] = nil
@user = User.new
else
@user = User.new(params[:user_id])
logged_in_user = @user.try_to_login
if logged_in_user
session[:user_id] = logged_in_user
jumpto = session[:jumpto] || { :action => "index" }
session[:jumpto] = nil
redirect_to(jumpto)
else
flash[:notice] = "Invalid user/password combination"
end
end
end
What We Just Did
在本次会话结束时,我们完成了下列工作:
1、我们在user model中使用了钩子方法来将password从应用程序的纯文本映射到数据库的哈希处理后形式。我们也使用了钩子在哈希处理后的密码被保存后移除用户对象的纯文本密码。
2、我们将一些应用范围的controller helper方法移到app/controllers目录里application.rb文件中的ApplicationController类。
3、我们使用一种新的动作方法和view的交互形式,在该形式中单一的动作利用request类型来决定它是否应该显示一个新的view还是处理现有的数据。
4、我们利用before 过滤器调用authorize()方法来控制对管理功能的访问。
5、我们使得侧边栏的菜单动态化,仅当管理者登陆以后才显示。
6、我们看到了如何生成应用的文档。

浙公网安备 33010602011771号