2008-04-09

#012_重构用户名 PART3

关键字: rails 重构
require File.dirname(__FILE__) + '/../test_helper' class UserTest < Test::Unit::TestCase fixtures :users def test_full_name_without_middle_initial user = User.new(:first_name => 'John', :last_name => 'Doe') assert_equal 'John Doe', user ...
2008-04-09

#011_重构用户名 PART2

关键字: rails 重构
接着010里面的例子,让我们先写User类的单元测试吧 require File.dirname(__FILE__) + '/../test_helper' class UserTest < Test::Unit::TestCase fixtures :users def test_full_name_without_middle_initial user = User.new(:first_name => 'John', :last_name => 'Doe') assert_equal 'John Doe', user.full_name ...
2008-04-09

#010_重构用户名 PART1

关键字: rails 重构
有这么几行视图代码,用来显示英文全名 Name: <%= @user.first_name %> <%= "#{@user.middle_initial}." unless @user.middle_initial.nil? %> <%= @user.last_name %> 当我们希望在多个页面内都显示这个全名,是否每次都要写这么4行代码呢? 想想我们的DRY原则,放弃这种不优雅的做法吧 class User < ActiveRecord::Base def full_name name = first_name ...
2008-04-08

#009_过滤日志中的敏感数据

关键字: 过滤 敏感数据 日志
当我们注册用户的时候,在日志中会自动保存一些敏感的字段,比如password等。 Processing LoginController#save (for 127.0.0.1 at 2008-04-08 13:53:22) [POST] Session ID: b40f205b38bd05382dc8ef2f362f5d5b Parameters: {"user"=>{"password_confirmation"=>"aaaaaa111", "login_name"=>"sora", "display_name"=>"Sora", "password"=>"aaaaaa111"} ...
2008-04-07

#008_layouts和content_for

关键字: layout content_for
如果我们希望在不同页面使用不同的样式,我们可以使用layouts + content_for,如第8行: <!-- layouts/application.rhtml --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <title>Todo List</title> <%= styles ...
2008-04-06

#007_关于layouts

关键字: layout
一般说来,layouts有5种:global layouts, controller layouts, shared layouts, dynamic layouts, action layouts. 假设有这样一个视图 <!-- views/projects/index.rhtml --> <h2>Projects</h2> <ul> <% for project in @projects %> <li><%= project.name %></li> <% end %> </ul> 1. global layo ...
2008-04-05

#006_用to_proc标记缩写代码块

关键字: to_proc block
我们经常需要将一个代码块传递给迭代器,并在代码块中调用另一个方法。Rails提供了一条实现这一功能的捷径,于是下面两句代码等价: groups = posts.group_by { |post| post.author_id } groups = posts.group_by(&:author_id) 让我们看下这一切是如何工作的: class Symbol # Turns the symbol into a simple proc, which is especially useful for enumerations. Examples: # # ...
2008-04-02

#005_使用with_scope

关键字: with_scope merge reverse_merge
接着004中的例子,004中我们希望找出所有未完成的任务,好吧,我承认,我半途而废的事实在是太多了,也许有几百个上千个,谁知道呢,一张A4纸肯定打不下,也许我应该先列出前20条,一条一条解决以后再去考虑后面的? 事实就是这样,我要列出找到的前20条,并且距现在最近的事排在前面最先解决,更加以前的事就算忘了对现在的我也没什么影响。于是按照前面的方法,我们会这样说 Task.find_all_by_complete(false, :limit => 20) 进一步的,我们照004中的办法把find移入model,并且使用了with_scope,我们仍然能往find_incomplete里传入ha ...
2008-04-02

#004_将查询移入模型类

关键字: find 移入 model
根据DHH提出的DRY原则,我们将一个公用的find方法移入model类(比如本例中的查找所有未完成的任务),然后就可以在controller中多次重用,也包括通过表间关联来查找。 # tasks_controller.rb def index @tasks = Task.find_incomplete end # models/task.rb def self.find_incomplete find_all_by_complete(false, :order => 'created_at DESC') end # projects_controller.rb ...
2008-04-01

#003_通过表间关联来查找

关键字: 表间关联 查询 外键
Rails不要求在迁移任务中建立外键约束,在迁移任务中创建project_id字段后在Project和Task模型中加上相应的声明。 # project.rb has_many :tasks # task.rb belongs_to :project # projects_controller.rb def show @project = Project.find(params[:id]) @tasks = Task.find(:all, :conditions => [ 'project_id = ? AND complete = ?', @project.id ...
2008-04-01

#002_动态find_by方法

关键字: find_by find_all_by 动态查询
@tasks = Task.find(:all, :conditions => [ 'complete = ?', false ]) @task = Task.find(:first, :conditions => [ 'complete = ?', false ], :order => 'created_at DESC') 以动态的find_by和find_all_by方法缩短查询语句,以下代码等效。 @tasks = Task.find_all_by_complete(false) @task = Task.find_by_complete(false, :order => 'crea ...
2008-04-01

#001_实例变量做查询缓存

关键字: 实例变量 缓存
看了Kevin Yang对初学者的建议,终于决定开始学习Railscasts了,目前一共有99个例子,暂且希望能每天坚持学习至少一个,并以文字的形式表述出来。 User.find(session[:user_id]) 以上代码每次都会向数据库发起一条查询请求,为了提高性能,只需要多加一个或标记,就可以在已赋值的情况下不再发起查询请求。 @current_user ||= User.find(session[:user_id]) 不过,论坛中的某位高人说了: hideto 写道看起来不错,但是实际上有问题: 实例变量的作用域是一次请求,即一次请求结束后@current_user这个实 ...
wiisola
搜索本博客
最近加入圈子
存档
最新评论