2013-02-27 59 views
3

创建时使用rails generate scaffold person新的资源,为destroy创建下列控制器动作:Rails的:生成的控制器语法

class PeopleController < ApplicationController 
    def destroy 
    @person = Person.find(params[:id]) 
    @person.destroy 

    respond_to do |format| 
     format.html { redirect_to people_url } 
     format.json { head :no_content } 
    end 
    end 
end 

写我自己的destroy动作时,我总是重复这句法。

我的问题是,为什么生成的代码:

  1. 分配一个从未使用过的实例变量?
  2. 当只需要一个数据库时,执行两个数据库调用?

下面的代码是否等价,还是有没有这样做的原因?

class PeopleController < ApplicationController 
    def destroy 
    Person.destroy(params[:id]) 

    respond_to do |format| 
     format.html { redirect_to people_url } 
     format.json { head :no_content } 
    end 
    end 
end 
+0

它们在功能上等同。我的猜测是,这就是为了保持一致 - 所有其他默认操作都设置了实例变量,为什么会有异常? – MrTheWalrus 2013-02-27 17:42:07

回答

1

一看the source code表明Person.destroy(params[:id])相当于Person.find(params[:id]).destroy

# File activerecord/lib/active_record/relation.rb, line 377 
def destroy(id) 
    if id.is_a?(Array) 
    id.map { |one_id| destroy(one_id) } 
    else 
    find(id).destroy 
    end 
end 
+0

有趣的是,两种方法的表现都应该是相同的,只是一个是多余的。 – gjb 2013-02-28 10:38:23