ссылка для удаления файла из каталога - PullRequest
1 голос
/ 02 марта 2011

В приложении rails 2.3.8 я пытаюсь написать ссылку в представлении, которое передает имя файла методу в контроллере, который удаляет файл из каталога.Не удалось получить правильный синтаксис.Я обновил код ниже, чтобы отразить предложения Тобиаса.Это работает, за исключением имен файлов, в которых есть пробелы.

В файле 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 Ответ

1 голос
/ 02 марта 2011

Я думаю, вы смешиваете маршруты ресурсов с именованными маршрутами.

С именованным маршрутом

Маршрут:

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]}") 

Предупреждение:

Как указывает Дэн, напрямую используя изменяемое пользователем значениев File.delete это действительно плохая идея.Вот ссылка на руководство Rails по очистке имен файлов:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...