链接从目录中删除文件

时间:2011-03-01 23:02:20

标签: ruby-on-rails

在rails 2.3.8 app中,我试图在视图中编写一个链接,将文件名传递给控制器​​中的方法,该控制器从目录中删除文件。无法正确使用语法。我已更新下面的代码以反映Tobias的建议。除了文件名中包含空格外,它才有效。

在documents_conroller.rb文件中有以下方法:

def file_cleanup
  File.delete("#{RAILS_ROOT}/public/downloads/#{params[:filename].gsub /[^\.\w]/, ''}") 
  redirect_to :action => :index
end

在视图中:

<% @files.each do |f| %>
   <% str = f.gsub(/^.*\//, '') %>
   <tr>
      <td>
          <%=str%>
      </td>
      <td>
          <%= link_to "Del", file_cleanup_path(:filename => str) %>
      </td>
   </tr>
<% end -%>

在路线档案中:

map.file_cleanup '/file_cleanup', :controller => 'documents', :action => 'file_cleanup'

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我认为你将资源路线与命名路线混合在一起。

使用指定路线

路线:

map.file_cleanup '/file_cleanup', :controller => 'documents', :action => 'file_cleanup'

在视图中,将文件名作为参数传递给链接url:

link_to "Del", file_cleanup_path(:filename => str)

然后在控制器中,使用params[:filename]获取值:

File.delete("#{RAILS_ROOT}/public/downloads/#{params[:filename].gsub /[^\.\w]/, ''}") 

使用资源路径

在路线中,添加新的成员方法:

map.resources :documents, :member => { :file_cleanup => :get }

在视图中,您使用现在拥有的链接:

link_to "Del", file_cleanup_document_path(str)

在控制器中,使用params[:id]获取值:

File.delete("#{RAILS_ROOT}/public/downloads/#{params[:id]}") 

警告:

正如Dan指出的那样,直接在File.delete中使用用户可修改的值是一个非常糟糕的主意。以下是有关清理文件名的Rails指南的链接:

http://guides.rubyonrails.org/security.html#file-uploads