在视图中显示载波文件名

我试图显示在一个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的一部&#x5206;

    如果要获取文件名,可以直接从数据库列读取文件名,也可以使用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在上面的回应的简洁的重述/合并。