私はRailsを初めて使用し、CRUD手法を使用してRESTful Webサイトを作成しています。これまでに、3つのページを作成しました。これらのすべてを使用して、ユーザーはデータベースから行を作成、編集、および削除できます。ただし、4番目のページにはアップロードファイルフォームを含める必要がありますが、a)ファイルシステムがRailsでどのように機能するかがわからないため、ファイルを保存する場所がわかりません。ファイルは約100 kbになり、常にダウンロードされるため、一時ストレージに保存できませんでした。 b)ファイルへの書き込み方法がわかりません。
上記で説明したことを行う方法を教えていただければ幸いです-入力フォームでアップロード入力を作成し、別のディレクトリのファイルパスにファイルを書き込みます。
2018年に更新
以下に書かれていることはすべて当てはまりますが、Rails 5.2にはactive_storage
が含まれ、S3(または他のクラウドストレージサービス)への直接アップロード、画像変換などが可能になります。 Railsガイド そして、自分のニーズに合ったものを自分で決めます。
ファイルのアップロードをかなりうまく解決する宝石がたくさんありますが(リストについては https://www.Ruby-toolbox.com/categories/Rails_file_uploads をご覧ください)、Railsが構築されました-独自のソリューションを簡単に展開できるヘルパー。
フォームでfile_field
- formヘルパーを使用すると、Railsがアップロードを処理します。
<%= form_for @person do |f| %>
<%= f.file_field :picture %>
<% end %>
次のように、アップロードされたファイルにコントローラーでアクセスできます。
uploaded_io = params[:person][:picture]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
file.write(uploaded_io.read)
end
達成したいことの複雑さに依存しますが、簡単なファイルのアップロード/ダウンロード作業にはこれで十分です。この例はRailsガイドから取られています。詳細についてはそこに行くことができます: http://guides.rubyonrails.org/form_helpers.html#uploading-files
2018年9月
最近この質問をチェックしている人は、 Rails 5.2+にはデフォルトでActiveStorageがあります。チェックアウトすることを強くお勧めします。
コアRails 5.2+の一部であるため、非常によく統合されており、すぐに使用できる優れた機能を備えています(Carrierwave、Shrine、Paperclipなどの他のすべての有名な宝石は...すばらしいですが、これは非常に優れた機能を提供しており、新しいRailsプロジェクトで検討できます)
Paperclipチームは、Rails ActiveStorageを支持してgemを廃止しました。
ここにActiveStorageのgithubページがあります &多くのリソースがどこでも利用可能です
このビデオも見つけました Activestorageの機能を理解するのに非常に役立つ
特にファイルをアップロードするための素晴らしい宝石があります: carrierwave 。 wikiが役に立たない場合は、 Nice RailsCast を使用して最適な方法を使用してください。要約すると、Rails formsにはfile
というフィールドタイプがあり、ファイルアップロードダイアログを呼び出します。使用できますが、「魔法」はcarrierwave
gemによって実行されます。
「ファイルへの書き込み方法」とはどういう意味かわかりませんが、これがいいスタートになることを願っています。
はい。ファイルをデータベースに保存せず、アセット(カスタムフォルダー)などのアプリケーションに保存したくない場合は、attr_accessor:documentで定義された非dbインスタンス変数を定義し、form_for - f.file_field
を使用してファイルを取得します。
コントローラーでは、
@person = Person.new(person_params)
ここperson_params
はホワイトリストに登録されたparams[:person]
を返します(自分を定義します)
名前を付けてファイルを保存、
dir = "#{Rails.root}/app/assets/custom_path"
FileUtils.mkdir(dir) unless File.directory? dir
document = @person.document.document_file_name # check document uploaded params
File.copy_stream(@font.document, "#{dir}/#{document}")
注、このパスを.gitignore
に追加します。このファイルを再び使用する場合は、asset_path
によるアプリケーションのapplication.rb
anを追加します
フォームがファイルフィールドを読み込むたびに、tmpフォルダに保存され、後であなたの場所に保存することができます。資産に保存する例を示しました
注:このようなファイルを保存すると、アプリケーションのサイズが大きくなり、Paperclip
を使用してデータベースに保存する方が適切です。
あなたのintiallizer/carrierwave.rbで
if Rails.env.development? || Rails.env.test?
config.storage = :file
config.root = "#{Rails.root}/public"
if Rails.env.test?
CarrierWave.configure do |config|
config.storage = :file
config.enable_processing = false
end
end
end
これを使用して、ローカルで実行中にファイルに保存します