Rails erbテンプレートでCarrierwave添付ファイルのファイル名を表示しようとしています。以下は機能しません。
<%= @page.form.filename %>
これは ドキュメント に沿っているようです。追加の手順が必要ですか?
私のページモデルは次のようになります。
class Page < ActiveRecord::Base
mount_uploader :form, FormUploader
end
フォームアップローダーは次のようになります。
class FormUploader < CarrierWave::Uploader::Base
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
def extension_white_list
%w(pdf)
end
end
あなたが見ているドキュメントはサニタイズされたファイルで、実際にファイルを保存するために使用するものです。探している部分はアップローダーであるFormUploaderであり、 http://rubydoc.info/gems/carrierwave/0.5.2/CarrierWave/Uploader の一部です
ファイル名を取得したい場合は、データベース列から直接読み取るか、File.basename(@page.form.path)
を使用して簡単に抽出できます。
file
内部パラメーターを介してファイル名を取得できました。
<%= @page.form.file.filename %>
Carrierwave docs は少しずれているかもしれませんが、推奨される方法は次のようです:
@page.form.file.identifier
@adamondutyのソリューションは素晴らしいです。以前に使用した別のソリューションは、モデルにメソッドを作成するだけです:
def name
file.path.split("/").last
end
あなたは正しい@epylinknです。使用に関するドキュメントのポイント:
@page.form.file.identifier
しかし、それを使用すると、常にnil
を取得します(@Chengがコメントしたとおり)。
次に、オブジェクトのメソッド(@page.form.file.methods.inspect
)、そして以下が機能することがわかりました:
@page.form.file_identifier
モデルの関連するアップローダークラスで、filenameメソッドを定義します。
def filename
File.basename(path)
end
その後、呼び出すことができます
model_instance.file.filename
CarrierWave 1.1.0以降で動作します。これは、上記のキキトとクリスアリーの回答の簡潔な修正/変更です。
ActiveRecordを使用している場合、次の2つの方法でform
という名前のフィールドに直接アクセスできます。
def my_method
self[:form]
end
または
def my_method
form_before_type_cast
end
2番目の方法は読み取り専用です。
このようなモデルがあると思いますか?
class Page
mount_uploader :form, FormUploader
end
もしそうなら、あなたは呼び出すことができるはずです:
@page.form.url
@page.form.filename
ファイルを正しくアップロード/添付しましたか? @ page.formを調べると何が見えますか?添付ファイルは、アップロードが完全に処理されるまで保存されないことに注意してください。
これは私の解決策です:
before_save :update_file_attributes
def update_file_attributes
if file.present? && file_changed?
self.content_type = file.file.content_type
self.file_size = file.file.size
self.file_name = read_attribute(:file)
end
end
CarrierWave::SanitizedFile
には、アップロードされたファイルのファイル名を含むプライベートoriginal_filename
メソッドがあります。 (ドキュメント: http://rdoc.info/github/jnicklas/carrierwave/master/CarrierWave/SanitizedFile:original_filename )
CarrierWaveメーリングリストのこのスレッド を読んだ後、私のニーズに合うものはありませんでした。のようなもので
class Upload < ActiveRecord::Base
mount_uploader :file, FileUploader
# ...
元のファイル名から:file
列の値を大幅に変更します。このため、CarrierWaveにバインドされている列とは別の列で元のファイル名を追跡することにしました。 FileUploader
に、プライベートoriginal_filename
メソッドをラップするリーダーを追加しました。
def original_file
original_filename
end
その後、before_create
イベントをUpload
クラスに追加しました(私のUpload
レコードは変更されないため、before_create
を使用できます私のニーズに合わせて)
before_create do
self.original_file = self.file.original_file
end