使用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动作时,我始终会复制此语法。

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


分配一个从未使用过的实例变量?
仅需要一个时执行两个数据库调用?


以下代码是否等效,或者是否有理由不这样做?

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

最佳答案

观察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

关于ruby-on-rails - Rails:生成的 Controller 语法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15118361/

10-15 02:53