新手问题 关于 carrierwave 如何获取 original_filename 值感想

pathbox · 2015年05月27日 · 最后由 pathbox 回复于 2015年05月27日 · 3316 次阅读

近工作使用 carrierwave 做上传文件的功能。只是上传文件,比如 word 文件,txt 文件。然后需要有一个列表页面,需要显示上传的文件的名称。比如:上传了一个 goodrails.txt 的文件,需要在列表的第二列显示 文件名称,即 goodrails.txt 要显示出来,让使用者日后查看时,知道上传了什么文件。在 carrierwave 中显示的上传文件名称会存储到 original_filename 中,所以思路就是拿到 original_filename 的值就行了。

carrierwave 中有一个

#def filename
#  "something.jpg" if original_filename
# end  方法,大家应该不陌生。就是自定义存入upload文件夹中的文件名称。比如在上传图片时,这样写
     (参考大神的文章 http://huacnlee.com/blog/carrierwave-upload-store-file-name-config/)
    def filename
        if original_filename
      @name ||= Digest::MD5.hexdigest(current_path)
      "#{@name}.#{file.extension}"
    end

通过查看后台传的参数,如 Processing by UpdateFilesController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"hGKDQsOQPBhpEyKDuLhOIOTNDGJ+VlZoNrLblcVNEl1cIXcTh+ePmy46G7ZdfUZlaUZJqsHcIG/ny4WTEo3MRw==", "update_file"=>{"name"=>"", "file_url"=>#, @original_filename="welcome.html.bak.erb", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"update_file[file_url]\"; filename=\"welcome.html.bak.erb\"\r\nContent-Type: application/octet-stream\r\n">, "file_url_cache"=>""}, "commit"=>"提交"}

然后在 modle 写了一个 after_create 回调 代码是这样的:

 class UpdateFile < ActiveRecord::Base
   mount_uploader :file_url, UpdatefileUploader
   after_create :save_filename

  def save_filename
     self.filename = self.file_url.get_original_filename
         self.save
  end
end

直接得到 original_filename,存到数据库表里,但是这样报了一个 错误,private method `original_filename' called for #UpdatefileUploader:0x007fdbaddbfc00. original_filename 是私有方法。外部不能调用。 好吧,和同事讨论后。决定在 updatefile-uploader。rb 文件中,写一个 public 的方法,去得到私有的 original-filename 这样

def get_original_filename
  return original_filename
end

然后在修改 model 中 after_create 的方法为

def save_filename
  self.filename = self.file_url.get_original_filename
  self.save
end

ok 顺利通过。 从这个问题也学习到了,如果一个方法或变量是私有的,可以在那个类里面写一个 public 的方法来获得这个方法的返回值或变量 供给外部调用。第一次发帖,经验不足,请大家指正。

你用public :original_filename就可以把他变成公开的了。

多用一用预览功能,这排版能看?

#1 楼 @huacnlee 第一次 写贴,刚摸索出排版功能了

#2 楼 @lolychee 试一试,谢谢!

#3 楼 @greatghoul 终于摸索出 排版功能

需要 登录 后方可回复, 如果你还没有账号请 注册新账号