在视图中显示Carrierwave文件名

时间:2011-02-27 11:07:25

标签: ruby-on-rails ruby-on-rails-3 carrierwave

我试图在Rails erb模板中显示Carrierwave附件的文件名。以下不起作用:

<%= @page.form.filename %>

这似乎与the documentation一致。需要一些额外的步骤吗?

我的页面模型如下所示:

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

10 个答案:

答案 0 :(得分:80)

您正在查看的文档是已清理的文件,它是用于实际存储文件的文件。您正在寻找的部分是FormUploader,它是一个上传者,是http://rubydoc.info/gems/carrierwave/0.5.2/CarrierWave/Uploader的一部分

如果要获取文件名,可以直接从数据库列中读取它,也可以使用File.basename(@page.form.path)轻松解压缩。

答案 1 :(得分:77)

我可以通过file内部参数获取文件名:

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

答案 2 :(得分:14)

Carrierwave docs可能有点偏,但推荐的方式似乎是:

@page.form.file.identifier

答案 3 :(得分:9)

@ adamonduty的解决方案很棒。我之前使用过的另一个解决方案,就是在模型上创建一个方法:

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

答案 4 :(得分:6)

你是对的@epylinkn。文档指向使用:

@page.form.file.identifier

但是当我使用它时,我总是得到nil(就像@Cheng评论一样)。

然后我检查了我的对象方法(@page.form.file.methods.inspect),发现以下内容可以使用:

@page.form.file_identifier

答案 5 :(得分:4)

如果您使用的是ActiveRecord,则可以通过两种方式直接访问名为form的字段:

def my_method
  self[:form]
end

def my_method
  form_before_type_cast
end

第二种方法是只读的。

答案 6 :(得分:4)

在模型的关联上传器类中,定义文件名方法。

FILTER

然后你可以打电话

.load()

从CarrierWave 1.1.0起作用。这是对kikito和Chris Alley上述回应的简洁重述/合并。

答案 7 :(得分:2)

我假设你有这样的模特?

class Page
  mount_uploader :form, FormUploader
end

如果是这样,您应该可以致电:

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

您确定已正确上传/附加文件吗?你在检查@ page.form时看到了什么?请记住,在您完全处理完上传后,才会保存附件。

答案 8 :(得分:1)

CarrierWave::SanitizedFile有一个私有的original_filename方法,其中包含上传文件的文件名。 (文档:http://rdoc.info/github/jnicklas/carrierwave/master/CarrierWave/SanitizedFile:original_filename

阅读this thread from the CarrierWave mailing list后,似乎没有人符合我的需要。有点像

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 < / em>的

before_create do
  self.original_file = self.file.original_file
end

答案 9 :(得分: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