我试图在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
答案 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