55

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
4

10 に答える 10

81

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

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

于 2011-02-28T02:44:15.020 に答える
16

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

@page.form.file.identifier
于 2013-09-06T03:08:33.860 に答える
9

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

def name
  file.path.split("/").last
end
于 2012-07-02T07:13:52.357 に答える
6

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

@page.form.file.identifier

しかし、私がそれを使用すると、常に得られますnil(@Chengがコメントしたように)。

次に、オブジェクトのメソッド ( @page.form.file.methods.inspect) を調べたところ、次のように機能することがわかりました。

@page.form.file_identifier
于 2014-07-18T17:29:07.333 に答える
4

ActiveRecord を使用している場合、次のform2 つの方法で名前付きフィールドに直接アクセスできます。

def my_method
  self[:form]
end

また

def my_method
  form_before_type_cast
end

2 番目の方法は読み取り専用です。

于 2012-03-16T22:36:14.573 に答える
3

CarrierWave::SanitizedFileoriginal_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
于 2011-04-30T13:45:42.343 に答える
2

私はあなたがこのようなモデルを持っていると思いますか?

class Page
  mount_uploader :form, FormUploader
end

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

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

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

于 2011-02-27T17:06:31.437 に答える
1

これが私の解決策です:

  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
于 2013-04-21T09:30:47.977 に答える