Rails

Rails 使用 carrierwave 上传文件

Posted on

……崩溃,找了很久的资料,最后找到一份template才解决问题。

carrierwave是一个rails 上传文件的 gem,然而用不来……
作者在 github 上的文档真的很没有条理性

前言

偶然间看到这篇文章,希望读者也可以多思考一下。
现在框架发展这么迅速,各种api泛滥,我们在寻求解决一个问题的时候,往往会有点急功近利。如果你考虑了底层实现,那你才是真正学到了东西,并能广泛运用它。否则,你顶多只是积累了当前框架或者api的使用经验。换了一个框架你就完全不会了。

但我的确是看完了这篇文章,我也的确去思考了,但是还是不会用!!!
因为网上很多文章和博客都忽略了一个非常重要的地方,下面我会说明。

这里详细介绍一下 carrierwave 的用法,并假设你已经开了上面那篇文章并思考过了。

安装

首先是安装,在gemfile中输入 gem 'carrierwave', '~> 1.0' 并执行 bundle install

carrierwave 实际建立的是 model ,但这里便于区分并且生成的类同时也是 uploader ,输入命令

rails generate uploader Image

这里的 Image 是由你自己取名的 uploader ,输完后就会生成一个 ruby文件,关于文件上传的一些设置一般都是在这个文件中。

app/uploaders/image_uploader.rb

View

根据MVC,我们先写 views ,一般是在某个目录下的 new.html.erb

<%= form_for @comic, :url => comics_path,:html => {:multipart => true} do |t|%>
# 其他代码

    <br><%= t.label :image, '漫画封面' %></br>
    <%= t.file_field :image %>
    <%= t.hidden_field :image_cache %>

# 其他代码
<% end %>

这里一定一定一定要注意, :html => { :multipart => true } 这个hash一定要加!!!只有加了这个才能上传文件,别问我什么意思,什么道理,我不知道……

Controller

然后是controller,一般为 某个目录下的 create 函数
其实在controller只要和平常一样操作即可,这里还是放上我写的吧

  def create
    @comic = Comic.new(comic_params)

    if @comic.save
        # 其他代码
    else
        # 其他代码
    end
  end

Uploader 的 其他配置

太复杂的高级用法我就不说了,更何况我自己也不会

在预生成的 *_uploader.rb 文件中, 你可以通过重载若干函数来实现你的自定义

store_dir

非重载函数,意思为上传目录,上传目录的相对路径根目录在 public,路径问题上你可以自己设置

extension_whitelist

重载函数,意思为上传文件白名单,默认为所有文件

filename

重载函数,用途为更改文件名,默认和 变量 original_name 相同

default_url

重载函数,虽然没用过,但是看文档还是看懂了,意为默认文件,如果你没有上传任意文件,就将你设置的 default_url 传给你 new 的对象

其他就不是很清楚了。

图片的使用

因为在我的课设中只会上传图片,这里说一下上传图片的使用

因为新增加的类是 uploader ,它实质上有很多属性,比如,filename, original_name, store_dir, url 等等
,而我们显示图片其实只需要一个 url 即可。

在 View 中输入

<%= image_tag comic.image_url %>

就可以显示当前 comic 的 image