是否需要@resource_name = ResourceName.find(params [:id])?在Rails控制器中

时间:2014-01-07 14:14:19

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

当我使用Rails项目之一时,我发现了以下行为(对我来说很神奇):

当我通过点击UI中的某个按钮执行deletion操作时,它会调用控制器的destroy方法,如下所示:

def destroy
  @video = Video.find(params[:id])
  @video.destroy
  respond_to do |format|
    format.html { redirect_to videos_url }
    format.json { head :no_content }
  end
end

以上代码工作正常。但奇怪的是,我删除了行@video = Video.find(params[:id]),仍然deletion操作正常。

没有@video = Video.find(params[:id])的操作的服务器日志:

Started DELETE "/videos/52cc08c979478fd5e9000004" for 10.10.10.205 at 2014-01-07 19:32:42 +0530
Processing by VideosController#destroy as JSON
  Parameters: {"id"=>"52cc08c979478fd5e9000004"}
  MOPED: 127.0.0.1:27017 COMMAND      database=admin command={:ismaster=>1} (0.8347ms)
  MOPED: 127.0.0.1:27017 QUERY        database=le collection=users selector={"$query"=>{"_id"=>"52833e4d79478f53b4000001"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (0.8261ms)
  MOPED: 127.0.0.1:27017 QUERY        database=le collection=assets selector={"_id"=>"52cc08c979478fd5e9000004", "_type"=>{"$in"=>["Video"]}} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (1.3051ms)
  MOPED: 127.0.0.1:27017 DELETE       database=le collection=assets selector={"_id"=>"52cc08c979478fd5e9000004"} flags=[:remove_first] (0.3262ms)
Completed 204 No Content in 29ms (ActiveRecord: 0.0ms)

@video = Video.find(params[:id])的操作的服务器日志:

Started DELETE "/videos/52cc093179478fcba6000005" for 10.10.10.205 at 2014-01-07 19:33:36 +0530
Processing by VideosController#destroy as JSON
  Parameters: {"id"=>"52cc093179478fcba6000005"}
  MOPED: 127.0.0.1:27017 QUERY        database=le collection=users selector={"$query"=>{"_id"=>"52833e4d79478f53b4000001"}, "$orderby"=>{:_id=>1}} flags=[:slave_ok] limit=-1 skip=0 batch_size=nil fields=nil (1.1661ms)
  MOPED: 127.0.0.1:27017 QUERY        database=le collection=assets selector={"_id"=>"52cc093179478fcba6000005", "_type"=>{"$in"=>["Video"]}} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.8740ms)
  MOPED: 127.0.0.1:27017 QUERY        database=le collection=assets selector={"_id"=>"52cc093179478fcba6000005", "_type"=>{"$in"=>["Video"]}} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.8311ms)
  MOPED: 127.0.0.1:27017 DELETE       database=le collection=assets selector={"_id"=>"52cc093179478fcba6000005"} flags=[:remove_first] (0.1166ms)
Completed 204 No Content in 26ms (ActiveRecord: 0.0ms)

我发现的唯一区别是database requests

的模式

第一个案例:没有行@video = Video.find(params [:id])

COMMAND -> QUERY -> QUERY -> DELETE

第二个案例:使用@video = Video.find(params [:id])

QUERY -> QUERY -> QUERY -> DELETE

有人可以帮助我启发这背后的神奇行为吗?另外,哪一个更好用?

1 个答案:

答案 0 :(得分:0)

目前还不清楚你的答案是什么,但我会在Rails控制器中提到“需要@resource_name = ResourceName.find(params [:id]吗?”

简单的答案是:是的!

rails中没有任何内容可以自动为您执行此操作。然而,有一些宝石,如体面曝光等,实现类似于你描述的行为。

除非您发布完整的控制器代码,包括继承和mixins以及您的Gemfile,否则很难找到“问题”的来源。

代码重新加载可能存在问题,重新启动服务器实例可能会显示不同的行为。