web-dev-qa-db-ja.com

ビューにCarrierwaveファイル名を表示する

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
50
Chris Alley

あなたが見ているドキュメントはサニタイズされたファイルで、実際にファイルを保存するために使用するものです。探している部分はアップローダーであるFormUploaderであり、 http://rubydoc.info/gems/carrierwave/0.5.2/CarrierWave/Uploader の一部です

ファイル名を取得したい場合は、データベース列から直接読み取るか、File.basename(@page.form.path)を使用して簡単に抽出できます。

80
Zachary Anker

file内部パラメーターを介してファイル名を取得できました。

<%= @page.form.file.filename %>
79
kikito

Carrierwave docs は少しずれているかもしれませんが、推奨される方法は次のようです:

@page.form.file.identifier
14
epylinkn

@adamondutyのソリューションは素晴らしいです。以前に使用した別のソリューションは、モデルにメソッドを作成するだけです:

def name
  file.path.split("/").last
end
9
omarvelous

あなたは正しい@epylinknです。使用に関するドキュメントのポイント:

@page.form.file.identifier

しかし、それを使用すると、常にnilを取得します(@Chengがコメントしたとおり)。

次に、オブジェクトのメソッド(@page.form.file.methods.inspect)、そして以下が機能することがわかりました:

@page.form.file_identifier
6
skplunkerin

モデルの関連するアップローダークラスで、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番目の方法は読み取り専用です。

4
adamlamar

このようなモデルがあると思いますか?

class Page
  mount_uploader :form, FormUploader
end

もしそうなら、あなたは呼び出すことができるはずです:

@page.form.url
@page.form.filename

ファイルを正しくアップロード/添付しましたか? @ page.formを調べると何が見えますか?添付ファイルは、アップロードが完全に処理されるまで保存されないことに注意してください。

2
Winfield

これは私の解決策です:

  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
1
why

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
1
deefour