2011-03-01 20 views
1

私は、ファイルをディレクトリから削除するコントローラのメソッドにファイル名を渡すビューにリンクを書き込もうとしています。構文の権利を取得できませんでした。 Tobiasの提案を反映するために、以下のコードを更新しました。空白を含むファイル名を除き、動作します。 routesファイルでディレクトリからファイルを削除するリンク

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

:ビューで

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

:documents_conroller.rbファイルで

は、以下の方法であり、あなたの助けを

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

ありがとう!

+0

'params'は、 "s" は、ありません' param'で。 :) –

答えて

1

あなたは名前付きルートとリソースルートを混在させていると思います。名前付きのルート

経路と

:鑑み

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

、リンクURLにパラメータとしてファイル名を通過:

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

そしてコントローラにparams[:filename]を使用して値を取得します。

012リソースルートルートで

、新しいメンバーのメソッドを追加:

link_to "Del", file_cleanup_document_path(str) 

:ビューで

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

を、あなたが今持っているリンクを使用しますコントローラでは、params[:id]を使用して値を取得します。

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

警告:ダンが指摘するように

File.deleteで直接ユーザー修正値を使用することは本当に悪い考えです。ここでのRailsへのリンクは消毒ファイル名のガイドです:

あなたが欲しい

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

+1

あなたは彼がparams [:filename]をまずサニタイズすることをお勧めしますね、はい? –

+1

このビューは一般に公開されていません。 3人のスタッフだけがこのページにアクセスして、異なるビューを通してクライアントが利用できるドキュメントを管理することができます。あなたはまだ問題がありますか? – Jay

+0

@Jay:それは問題ではありません(私のユースケースはあなたのものに非常に似ています)。しかし、いつものように物事が間違ったり、あなたのビューにアクセスできない人がアクセスできるようになりました。ごめんなさいより安全だと思います。あなたの質問をもう一度おねがいします。それは私を助けた:) –

関連する問題