在视图中显示载波文件名
我试图显示在一个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
类(我的Upload
logging从不修改,所以一个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在上面的回应的简洁的重述/合并。