Rails 后台有一个交互选项怎么办?

lb563 · 2012年05月03日 · 最后由 aNdReW_Qx 回复于 2012年05月03日 · 2936 次阅读

我把情况说明清点:

我有一个数据管理系统,其中涉及到对文件的删除,我的实现如下:

  1. 提供按钮在页面上并通过这个按钮把要删除的资源名称传到服务器。

  2. 取得传过来的资源名然后拼接好资源的路径

  3. ruby 调用系统的 shell 命令例如:system "rm -r #{res_path}"

如果传过的资源路径存在的话,这个资源就会被删除。

说到这里我做了一个超级失败的事,上次没有进行路径判断,结果悲剧了
我执行了删除命令 (system "rm -rf #{res_path}/#{res_name}" 上面的的 res_path 没有给值,res_name 也没有给值,结果拼成的资源路径为"/") 然后把"/"这个目录下的东西全给删除了

经过上面的删除事件,我明白了写代码时应该多考虑些情况不然后遇到这种事会出大事的。

现在我把删除命令修改为:system "rm -r #{res_path}",并且对个路径进行验证。

我在命令行中尝试过,如果执行命令"rm -r #{res_path}"res_path 为 root 权限时,他会提示你是否删除这个文件。而当我执行命令rm -rf #{res_path} 这个会强制的删除res_path.``

说了这么多,我要回到主题了

现在我的删除命令是"rm -r #{res_path}"我在页面上加一按钮用来调用这个命令。
当我res_path为 root 权限时后台服务器就会停在那里
(提示是否删除res_path).但是我页面上就一直停在那里不走了。

像这种情况有没有办法处理一下。例如返给页面一个不能删除 root 提示信息等。各们大牛们给点建议吧.我实在没有想出什么好的方法了。

我用"mou"排的版在这里略有差别

加一个参数,在任何情况下都不输出 prompt rm -r #{res_path} --interactive=never

#2 楼 @suupic 在机器上测试了一下:

cd /tmp && mkdir -p libo/libo/libo/libo && chown -R root libo

然后执行命名 rm -r libo --interactive=never override rwxr-xr-x root/staff for libo/libo/libo/libo? override rwxr-xr-x root/staff for libo/libo/libo? override rwxr-xr-x root/staff for libo/libo? override rwxr-xr-x root/staff for libo? rm: --interactive=never: No such file or directory 从执行命令的结果来看,--interactive=never 这个是不可用。

啊..為什麼要用 system 呢?為啥不用內置的方法 rmdir ?

#4 楼 @ruohanc 不太好用: $ mkdir -p wcl/wcl && $ pry [1] pry(main)> FileUtils.rmdir "/Users/mile001/dev_study/gon_study/tmp/wcl" => ["/Users/mile001/dev_study/gon_study/tmp/wcl"] [2] pry(main)> .ls cache pids sessions sockets wcl 事实上我刚才新建了一个目录 "wcl/wcl"并调用了 FileUtils.rmdir 但是目录是删除失败的, 我理解这个方法不会循环删除类似于 shell rmdir

自己递归删除下不好吗?

#5 楼 @lb563 后来我也去试了一下....我也略微没有搞懂这个 rmdir 到底想干嘛,也没深究下去。因为找到了 FileUtils.remove_dir 这个没问题了...就是在删除前要检查文件夹存在与否....

#3 楼 @lb563

skywalker@skywalker-VirtualBox:/tmp$ sudo mkdir a
[sudo] password for skywalker: 
skywalker@skywalker-VirtualBox:/tmp$ rm -r a
rm:是否删除有写保护的 目录 “a”? 
skywalker@skywalker-VirtualBox:/tmp$ rm -r a --interactive=never
rm: 无法删除 “a”: 不允许的操作
skywalker@skywalker-VirtualBox:/tmp$ 

你的操作系统版本? 刚才又看了一下,发现--interactive=never 这个参数在 ubuntu10 有,centOS5 里没有

#8 楼 @suupic 可能是系统的原因了 我的是 mac osx 10.6 好像没有这个参数。

楼主你应该用FileUtils.rm_rf 这个方法.. 不管是目录还是文件,见啥删啥 看到你这个帖子就想起来上次 github 上著名的删除/usr 事件,哈哈

#10 楼 @aNdReW_Qx ..... 那样不好,不安全。

#11 楼 @lb563 有 secure 选项阿..楼主你看下文档~ http://apidock.com/ruby/FileUtils/rm_rf

需要 登录 后方可回复, 如果你还没有账号请 注册新账号