Rails:生成的控制器语法

时间:2013-02-27 17:26:46

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

使用rails generate scaffold person创建新资源时,会为destroy创建以下控制器操作:

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. 只需要一个时执行两次数据库调用?
  3. 以下代码是等效的,还是有理由不这样做?

    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
    

1 个答案:

答案 0 :(得分: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