Aiur

zellux 的博客

ActiveRecord 的一些细节

对象属性 ActiveRecord 对象在数据库中的属性并不是以实体变量的方式保存的,如果要为一个属性设置默认值的话, class Item < ActiveRecord::Base def category @category || 'n/a' end end 这样的实现是不可行的。读取和修改这些属性时应该使用 read_attribute 和 write_attribute: class Item < ActiveRecord::Base def category read_attribute(:category) || 'n/a' end end Hash 和相等性 ActiveRecord 的 hash 值是根据主键的值计算出来的,这就意味着未保存对象的 hash 值是不可靠的。同样两个 model 对象的相等比较(即==操作符)也是基于主键的,所以两个 model 对象即使它们的其他属性不一样,仍有可能被当作相等。 查找 find_by_attribute 方法后面加个 ! 号,即使用 find_by_attribute!,就能在找不到对象的时候触发一个 RecordNotFound 异常,而不是返回 nil。 find_or_initialize_by 和 find_or_create_by 也是两个好用的方法,它们在找不到对象时分别使用 new 和 create 新建一个,并用查找的属性初始化新建的对象。 手写 SQL 不得不手写 SQL 同时又要防止注入攻击的一个比较简洁的写法是 Order.where("name = :name and pay_type = :pay_type", params[:order]) 回调函数 出于性能考虑,after_find 和 after_initialize 只能通过函数声明的方式定义,即不能用类似 before_validation :normalize_fields 这样的形式。 阅读全文 →

render 方法的可选参数

:content_type 设置返回内容的 MIME 类型 render :file => filename, :content_type => 'application/rss' :layout 指定 layout :status 指定返回的 HTTP 代码 :location 指定 HTTP 头中的 Location 字段 Rails 生成的 controller 代码中,create.json 方法在生成对象后会将 Location 设置为新生成对象的 json 地址: respond_to do |format| if @item.save format.html { redirect_to @item, notice: 'Item was successfully created.' } format.json { render json: @item, status: :created, location: @item } else format.html { render action: "new" } format.json { render json: @item. 阅读全文 →

rspec 跳过指定测试

有些测试比较耗时间,而且很少被修改,如果能在测试的时候跳过它们就能让 spec 快不少。 跳过测试的方法很简单,spec 的 describe 方法可以给对应的测试加上标签,例如 describe SalesController, :slow => true do # specs end 接下来只要在 spec/spec_helper.rb 中声明跳过这个标签即可: RSpec.configure do |config| config.filter_run_excluding :slow => true end 与 filter_run_excluding 相反的是 filter_run,指定会被运行的标签,不包含在这个列表中的测试将被忽略。 参考:http://www.dixis.com/?p=283 阅读全文 →