carrierwave是一款经典的图片上传套件,本篇的目标是先在本地端(development)的rails项目试成功gem。

(预计中集的进度会练习怎么利用Amazone S3架设图片上传Host,

并再下集远端(production)实作上传,敬请期待!)

https://ithelp.ithome.com.tw/upload/images/20180904/20111177jA3W9YiK5l.png

在阅读任何Github上的README.md,有一点很重要的是知道因为环境设定的不同,必须渐渐了解哪些步骤可以跳过、哪些变数需要修改成符合自己项目性质的名称,这点身为新手的我,将会靠练习活用各式各样的gem来进步。:)

这次我们会更动的档案/文件夹如下:

Rails的构架说明

Gemfile设定Rails应用程序使用了哪些Gems套件

app放Controllers、Models和Views档案

接下来就按造步骤来实作吧(leafor)!

A.在gemfile加入套件,重启rails server:

首先我们按照carrierwave在githhub上说明档的指示,前往/项目名称/gemfile,新增代码:

gem 'carrierwave','~> 1.0'

README.md告诉我们CarrierWave的版本需求:Rails 4.0 or higher and Ruby 2.0,我的ruby 2.4.2 Rails 5.1.6,所以没有问题~

每次新增任何新的Gem到Gemfile,就要在Terminal输入bundle install处理相依性,然后rails s重启服务器。

tingdeMacBook-Air:yelpdemo tingtinghsu$ bundle install

tingdeMacBook-Air:yelpdemo tingtinghsu$ bundle info carrierwave

* carrierwave(1.2.3)

Summary: Ruby file upload library

Homepage: https://github.com/carrierwaveuploader/carrierwave

Path: /Users/tingtinghsu/.rvm/gems/ruby-2.4.2/gems/carrierwave-1.2.3

B.用rails g指令,新增Image uploader功能

接下来就可以看到carrierwave的厉害之处了,在此我需要将自己的餐厅(restaurants)数据库建立新的图片(image)字段,所以把carrier的指令客制化成自己的项目。

指令rails g uploader Image帮助我们在此路径:app/uploaders/image_uploader.rb新增了档案。

打开image_uploader.rb看看里面的类别写法:

class ImageUploader < CarrierWave::Uploader::Base

storage:file

#storage:fog

# Override the directory where uploaded files will be stored.

# def store_dir

“uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}”

end

这个部分指的是:

如果我把储存档案的地方放在本地端(localhost),就要把storage:file前的#注释拿掉

相对的,想要把储存档案的地方放在远端(Heroku),把storage:fog前的#注释拿掉

在本篇里,CarrierWave会把我上传的图片将会放在/public/uploads/restaurant/image。

C.建立数据库上传Image所需字段

建立迁移档(migration,修改数据库结构)

rails g migration add_image_to_restaurants image:string

并在数据库增加上传图片的字段:

rake db:migrate

然后重启服务器:rails s

顺利的在db/migrate跑出了add_image_to_restaurants.rb档案。打开来瞧瞧:

class AddImageToRestaurants < ActiveRecord::Migration[5.1]

def change

add_column:restaurants,:image,:string

end

end

D.修改Models,让数据库准备好存取图片的功能

接下来我们修改跟ActiveRecord有关的Models。mount Model里面,这个名为uploader上传功能小帮手,未来它会帮我们翻译数据库语言(SQL)跟数据库要数据(餐厅图片)。:

Models: app/models/restaurant.rb

class User < ActiveRecord::Base

mount_uploader:image,ImageUploader

end

在rails官网提到:

Active Record是MVC的M(Model)表现商业逻辑与数据的层级,负责新增与操作需要持久存在数据库里的数据。Active Record本身是ORM(Object Relational Mapping,物件关联映像)系统的描述。

E.修改Views

数据库的上传功能已经准备好了,接下来到Views跟表单沟通,请让表单能够接受上传的图片。

到app/views/restaurants/_form.html.erb,修改成可以上传照片的form type(表单型态)。

<%= form_with(model: restaurant,local: true,:html => { multipart: true })do |form| %>

我们来增加:「上传图片」字段,让使用者能在视觉上看得见新字段,并修改上传图片的档案(file)类型为form.file_field,不同于其他纯文字(text)字段如地址、电话的form.text_field。

<div class=“form-group”>

<%= form.label:name %>

<%= form.text_field:name,id::restaurant_name,class:“form-control”%>

</div>

<div class=“form-group”>

<%= form.label:image %>

<%= form.file_field:image,id::restaurant_image,class:“form-control”%>

</div>

告诉rails何时取得image。我们来到app/views/restaurants/show.html.erb,在餐厅数据前面加上代码:

<p id=“notice”><%= notice %></p>

<%= image_tag @restaurant.image_url if @restaurant.image_url.present?%>

<p>

<p>

<strong>Name:</strong>

<%= @restaurant.name %>

</p>

image_tag:Rails内置的Helper静态辅助方法,可以让我们建构HTML更为容易。参考这里

@restaurant.image_url:显示目前这笔餐厅数据的图片位置。

[新手常见Bug!]检查图片为nil写法:if @restaurant.image_url.present?。可以防止当某位使用者新增一笔餐厅数据、但没有附上图片的时候,show.html.erb这页网页直接当掉给你看…

F.修改Controllers

最后,我们在Controllers: app/controllers/restaurants.controller.rb加上允许上传至字段的参数,告诉rails,新的image字段是安全的(gdgfpy)。

def restaurant_params

params.require(:restaurant).permit(:name,:address,:phone,:website,:image)

end

**大功告成**

[Ting's笔记Day6]活用套件carrierwave gem:(1)在Rails实现图片上传功能的更多相关文章

  1. [Ting's笔记Day8]活用套件carrierwave gem:(3)Deploy图片上传功能到Heroku网站

    前情提要: 身为Ruby新手村民,创造稳定且持续的学习步调很重要,我用的方法就是一周在IT邦写三篇笔记,希望藉由把笔记和遇到的bug记录下来的过程,能帮助到未来想用Ruby on Rails架站的新手 ...

  2. [Ting's笔记Day7]活用套件carrierwave gem:(2)利用Amazon S3架设图片服务器

    来到第7篇了!培养写作习惯真是不容易:) 在我的上一篇文章活用套件carrierwave gem:(1)在Rails实现图片上传功能,上传图片功能已经完成啦!但是目前图片仅能上传在自己的本地文件夹内孤 ...

  3. [Ting's笔记Day9]活用套件Carrierwave gem:(4)使用Imagemagick修改图片大小

    前情提要: 这几天我都在实验Carrierwave这套图片上传套件,也顺利部署到Heroku架站正式环境了.:) 接下来我遇到了新的问题:要如何在上传的时候,让Carrierwave gem大型siz ...

  4. Ionic3学习笔记(十二)拍照上传图片以及从相册选择图片上传

    本文为原创文章,转载请标明出处 目录 安装插件 导入 app.module.ts 创建 provider 更多 效果图 1. 安装插件 终端运行: ionic cordova plugin add c ...

  5. ASP.NET工作笔记之一:图片上传预览及无刷新上传

    转自:http://www.cnblogs.com/sibiyellow/archive/2012/04/27/jqueryformjs.html 最近项目里面涉及到无刷新上传图片的功能,其实也就是上 ...

  6. cocoon + carrierwave 多图片上传用法

    gem 'cocoon' gem 'carrierwave' gem 'mini_magick' 1.图片上传carrierwave配置,github 自己手动添加的配置,没用命令生成 在app下新建 ...

  7. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传

    SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...

  8. AntDesign vue学习笔记(七)Form 读写与图片上传

    AntDesign Form使用布局相比传统Jquery有点繁琐 (一)先读写一个简单的input为例 <a-form :form="form" layout="v ...

  9. MVC OF UEditor 图片上传- 额外参数 笔记

    最近正巧需要用到UEditor ,因为需求,.需要把上传的图片数据上传到阿里云的OSS与记录图片相关信息到MS SQL中 . 不得已只能翻UEditor的实现代码>_<痛苦. 备忘笔记: ...

随机推荐

  1. [转]C++11常用特性的使用经验总结

    转载出处 http://www.cnblogs.com/feng-sc C++11已经出来很久了,网上也早有很多优秀的C++11新特性的总结文章,在编写本博客之前,博主在工作和学习中学到的关于C++1 ...

  2. php网站速度性能优化(转)

    一个网站的访问打开速度至关重要,特别是首页的打开加载过慢是致命性的,本文介绍关于php网站性能优化方面的实战案例:淘宝首页加载速度优化实践 .想必很多人都已经看到了新版的淘宝首页,它与以往不太一样,这 ...

  3. zabbix客户端的安装、zabbix主被动模式、添加主机模板等、处理页面的中文乱码

    1.zabbix客户端的安装: 如下步骤: wget repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch. ...

  4. 深入学习Motan系列(四)—— 客户端

    困惑的袋鼠,对框架的把握有些茫然,但是仍然一步步向前,行动总比一直迷茫停止不前要好,您说呢,各位客官? 这篇开始客户端的分析.有些地方的代码,就不每段都标出了,中间有跳跃的地方,请自己对照代码来看.鄙 ...

  5. 重建二叉树(JAVA)

    重建二叉树 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历 ...

  6. C#通过代码判断并注册程序集到GAC

    var dllName = "EasyHook.dll"; var dllPath = Path.Combine(AppDomain.CurrentDomain.BaseDirec ...

  7. H3C交换机配置vlan

    一,内存二,硬盘(分区,数据量大小)三,电源线,网络线四,raid(raid0,raid1,raid5)五,装系统(系统版本,分区)六,配置网络 1.创建用户 system-view #进入配置loc ...

  8. MySQL Error--Error Code

    mysql error code(备忘) 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导 ...

  9. 深入理解CSS系列(一):理解CSS的盒子模型

    接触前端也有好几个年头了,但是,讲实话,对于CSS的理解真的是不敢恭维,相信很多同行也有类似的感受吧!这是为什么呢?因为我们都认为CSS太简单了,没有必要深入学习,果真如此?其实,只不过是自己图样图森 ...

  10. Laravel 5.5处理 Emoji 表情不顯示問題

    服务器环境:PHP7 + MySQL5.6 + Laravel 5.5 項目有個玩樂日誌功能,添加玩樂日誌有富文本輸入,富文本輸入的內容在emoji表情之後被截斷了,沒保存到數據表,排查是對應字段字符 ...