在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'
感谢您的帮助!
答案 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指南的链接: