在视图中显示Carrierwave文件名

Chr*_*ley 50 ruby-on-rails ruby-on-rails-3 carrierwave

我试图在Rails erb模板中显示Carrierwave附件的文件名.以下不起作用:

<%= @page.form.filename %>
Run Code Online (Sandbox Code Playgroud)

这似乎与文档一致.需要一些额外的步骤吗?

我的页面模型如下所示:

class Page < ActiveRecord::Base

  mount_uploader :form, FormUploader

end
Run Code Online (Sandbox Code Playgroud)

表单上传器如下所示:

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
Run Code Online (Sandbox Code Playgroud)

Zac*_*ker 80

您正在查看的文档是已清理的文件,它是用于实际存储文件的文件.您正在寻找的部分是FormUploader,它是一个上传器,是http://rubydoc.info/gems/carrierwave/0.5.2/CarrierWave/Uploader的一部分

如果要获取文件名,可以直接从数据库列中读取它,也可以使用File.basename(@page.form.path)它轻松地提取它.

  • 你应该使用路径而不是url,使用带有aws或其他云提供商的url将包括querystrings (3认同)
  • 嗯,为什么它比Kikito回答`@ page.form.file.filename`更好? (2认同)

kik*_*ito 79

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

<%= @page.form.file.filename %>
Run Code Online (Sandbox Code Playgroud)


epy*_*nkn 14

Carrierwave文档可能有点过,但建议的方式似乎是:

@page.form.file.identifier
Run Code Online (Sandbox Code Playgroud)

  • @cheng尝试`@page.form.file_identifier` (7认同)

oma*_*ous 9

@ adamonduty的解决方案很棒.我之前使用过的另一个解决方案,就是在模型上创建一个方法:

def name
  file.path.split("/").last
end
Run Code Online (Sandbox Code Playgroud)


skp*_*rin 6

你是对的@epylinkn.文档指向使用:

@page.form.file.identifier
Run Code Online (Sandbox Code Playgroud)

但是当我使用它时,我总是得到nil(正如@Cheng评论).

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

@page.form.file_identifier
Run Code Online (Sandbox Code Playgroud)


Sol*_*tes 6

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

def filename
  File.basename(path)
end
Run Code Online (Sandbox Code Playgroud)

然后你可以打电话

model_instance.file.filename
Run Code Online (Sandbox Code Playgroud)

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