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

85

我已经能够通过file内部参数获取文件名:

<%= @page.form.file.filename %>
于 2012-05-07T13:59:36.667 回答
81

您正在查看的文档是经过清理的文件,它用于实际存储文件。您正在寻找的部分是 FormUploader,它是一个 Uploader,并且是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 回答
6

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

def filename
  File.basename(path)
end

然后你可以打电话

model_instance.file.filename

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

于 2017-09-02T00:51:14.060 回答
4

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

def my_method
  self[:form]
end

或者

def my_method
  form_before_type_cast
end

第二种方法是只读的。

于 2012-03-16T22:36:14.573 回答
3

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事件(我的记录从未被修改过,所以我的需要可以接受)UploadUploadbefore_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 回答