在视图中显示载波文件名

我试图显示在一个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文档可能有点偏离,但推荐的方式似乎是:

 @page.form.file.identifier 

@ adamonduty的解决scheme是伟大的。 我之前使用的另一个解决scheme,就是在模型上创build一个方法:

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

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

 def my_method self[:form] end 

要么

 def my_method form_before_type_cast end 

第二种方法是只读的。

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

 @page.form.file.identifier 

但是,当我使用这个,我总是得到nil (就像@Cheng评论)。

然后,我检查了我的对象方法( @page.form.file.methods.inspect ),并发现以下工作:

 @page.form.file_identifier 

我假设你有这样的模型?

 class Page mount_uploader :form, FormUploader end 

如果是这样,你应该可以打电话给:

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

你确定你已经上传/附加了正确的文件? 当你检查@ page.form时,你看到了什么? 请记住,只有完全处理上传,才能保存附件。

CarrierWave::SanitizedFile有一个私有的original_filename方法,包含上传文件的文件名。 (docs: 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(我的Uploadlogging从不修改,所以一个before_create是可以接受的我的需要)

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

这是我的解决scheme:

  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 

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

def filename File.basename(path) end

你可以打电话

model_instance.file.filename

适用于CarrierWave 1.1.0。 这是kikito和Chris Alley在上面的回应的简洁的重述/合并。