当我使用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
有人可以帮助我启发这背后的神奇行为吗?另外,哪一个更好用?
答案 0 :(得分:0)
目前还不清楚你的答案是什么,但我会在Rails控制器中提到“需要@resource_name = ResourceName.find(params [:id]吗?”
简单的答案是:是的!
rails中没有任何内容可以自动为您执行此操作。然而,有一些宝石,如体面曝光等,实现类似于你描述的行为。
除非您发布完整的控制器代码,包括继承和mixins以及您的Gemfile,否则很难找到“问题”的来源。
代码重新加载可能存在问题,重新启动服务器实例可能会显示不同的行为。