Rails项目集成Simditor编辑器

如果你刚好需要在Rails项目中集成一款编辑器,那么我推荐你使用Simditor。轻量级且易用,花个几分钟看一下吧。

前端需要引用的一些库

//= require jquery//= require module//= require hotkeys//= require uploader//= require simditor
= require simditor

[email protected]下载必要的文件

视图文件的写法

.ui.form
  = form_for @post do |f|
    .field
      = f.text_field :title,:label=>false,:id=>‘post_title‘,:placeholder=>‘请输入标题‘,:class=>‘ui transparent input‘
    .field
      = f.text_area :content,:label=>false
    .field
      = f.button :submit,:class=>‘ui fluid button‘
:javascript
  var editor = new Simditor({
    textarea: $(‘#post_content‘),
    placeholder: ‘请输入正文‘,
    defaultImage: ‘/image.png‘,
    fileKey: ‘upload_file‘,
    upload: {
      url: ‘/upload‘,
      leaveConfirm: ‘正在上传文件,如果离开上传会自动取消‘
    },
    pasteImage: true
  });

在js中

filekey保存上传文件的一些属性(这里的上传文件为图片)

upload属性需要注意的是url: ‘/upload‘这里指明。

路由的写法

根据upload的url:‘/upload‘我们可以写出对应的request处理路由

post ‘upload‘ => ‘upload#image‘

后台罗辑的处理

到这里前端的任务差不多完成了,最后我们来看一下后端的一些罗辑代码。

class UploadController < ApplicationController
  def image

    file = params[:upload_file]
    file_list = []
    success = true
    msg = ‘上传成功‘
    file_real_path = ‘‘

    if !file.content_type.match(/^image\/(gif|png||jpg||jpeg|){1}$/)
      success = false
      msg = "#{file.original_filename}:只支持上传JPG,JPEG,PNG格式图片"
    elsif file.size > 2*1024*1024
      success = false
      msg = "#{file.original_filename}:图片太大,请上传小于2M的图片"
    end
    if success
      file_real_path = save_file(file)
      file_list << file_real_path
    end
    logger.info file_real_path
    render json: {:success=>success, :msg=>msg,:file_path=>"/#{file_real_path}" }
  end

  private

  def save_file(file)
    extname = file.content_type.match(/^image\/(gif|png|jpg|jpeg){1}$/).to_a[1]
    filename = File.basename(file.original_filename,‘.*‘)
    uri = File.join(‘uploads‘,‘images‘,"#{DateTime.now.strftime(‘%Y/%m%d/%H%M%S‘)}_#{SecureRandom.hex(4)}_#{current_user.id}.#{extname}")
    save_path = Rails.root.join(‘public‘,uri)
    file_dir = File.dirname(save_path)

    FileUtils.mkdir_p(file_dir) unless Dir.exists?(file_dir)
    File.open save_path, ‘wb‘ do |f|
      f.write(file.read)
    end
    return uri
  end

end

这里需要注意的是后端处理之后应返回json,这里是:

render json: {:success=>success, :msg=>msg,:file_path=>"/#{file_real_path}" }

必须要返回插入图片的路径以便在前端页面显示。

举个栗子

提交之后,我们来看一下请求,在下面的日志中,可以仔细看一下上传图片的处理过程。

Started POST "/upload" for 127.0.0.1 at 2015-05-02 03:39:59 +0800
Processing by UploadController#image as */*
  Parameters: {"upload_file"=>#<ActionDispatch::Http::UploadedFile:0xba34087c @tempfile=#<Tempfile:/tmp/RackMultipart20150502-7561-lbplib.png>, @original_filename="Fruit-2.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"upload_file\"; filename=\"Fruit-2.png\"\r\nContent-Type: image/png\r\n">, "original_filename"=>"Fruit-2.png"}
  User Load (0.2ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 12 LIMIT 1
uploads/images/2015/0502/033959_a79e85fa_12.png
Completed 200 OK in 28ms (Views: 1.0ms | ActiveRecord: 0.2ms)

Started POST "/posts" for 127.0.0.1 at 2015-05-02 03:42:00 +0800
Processing by PostsController#create as HTML
  Parameters: {"utf8"=>"?", "authenticity_token"=>"dSggdOLs6OvBjtSL9KxuodHnrGmBoX8oWB7FCwuyDFaNGJkDCBl6t8wF2JLe3FT/SWqSHH2pEH1//0Ho0o+/uA==", "post"=>{"title"=>"这是标题", "content"=>"<p><b>粗体 </b>&nbsp; <i>斜体</i> &nbsp;<u>下划线</u> &nbsp;<strike>删除线文字</strike></p><ol><li>有序列表</li><li>有序列表</li></ol><ul><li>无序列表</li><li>无序列表</li></ul><p><img alt=\"Fruit-2.png\" src=\"/uploads/images/2015/0502/033959_a79e85fa_12.png\" data-image-size=\"80,80\"><br></p>"}, "button"=>""}
   (0.1ms)  BEGIN
  SQL (0.2ms)  INSERT INTO `posts` (`tags`, `title`, `content`, `created_at`, `updated_at`) VALUES (NULL, ‘这是标题‘, ‘<p><b>粗体 </b>&nbsp; <i>斜体</i> &nbsp;<u>下划线</u> &nbsp;<strike>删除线文字</strike></p><ol><li>有序列表</li><li>有序列表</li></ol><ul><li>无序列表</li><li>无序列表</li></ul><p><img alt=\"Fruit-2.png\" src=\"/uploads/images/2015/0502/033959_a79e85fa_12.png\" data-image-size=\"80,80\"><br></p>‘, ‘2015-05-01 19:42:00.407888‘, ‘2015-05-01 19:42:00.407888‘)
   (101.7ms)  COMMIT
Redirected to http://huxi.com/
Completed 302 Found in 107ms (ActiveRecord: 102.1ms)

最后看看Post存储在数据库中的内容

irb(main):008:0> Post.first
  Post Load (0.3ms)  SELECT  `posts`.* FROM `posts`  ORDER BY `posts`.`id` ASC LIMIT 1
=> #<Post id: 4, title: "这是标题", content: "<p><b>粗体 </b>&nbsp; <i>斜体</i> &nbsp;<u>下划线</u> &nb...", visited_count: nil, tags: [], created_at: "2015-05-01 19:42:00", updated_at: "2015-05-01 19:42:00">
irb(main):009:0> Post.first.content
  Post Load (0.1ms)  SELECT  `posts`.* FROM `posts`  ORDER BY `posts`.`id` ASC LIMIT 1
=> "<p><b>粗体 </b>&nbsp; <i>斜体</i> &nbsp;<u>下划线</u> &nbsp;<strike>删除线文字</strike></p><ol><li>有序列表</li><li>有序列表</li></ol><ul><li>无序列表</li><li>无序列表</li></ul><p><img alt=\"Fruit-2.png\" src=\"/uploads/images/2015/0502/033959_a79e85fa_12.png\" data-image-size=\"80,80\"><br></p>"
irb(main):010:0>

Over.

时间: 2024-10-11 04:53:48

Rails项目集成Simditor编辑器的相关文章

【代码导读】Github 开源项目——wysihtml5 富编辑器(Bootstrap 风格)【二】

如果您意外进入该页面,或许从下述链接开始更容易理解: [代码导读]Github 开源项目——wysihtml5 富编辑器(Bootstrap 风格)[一] 1. 整体结构 在 wysihtml5 中,所有对象受 wysihtml5 命令空间保护,从其初始化定义看,整个代码架构一目了然: https://github.com/xing/wysihtml5/blob/master/src/wysihtml5.js 1 var wysihtml5 = { 2 version: "0.4.0pre&qu

Spring学习(一)tomcat加载web.xml、以及项目集成Spring支持

tomcat容器加载web.xml 一. 1 .启动一个 WEB 项目的时候, WEB 容器会去读取它的配置文件 web.xml ,读取 <listener> 和 <context-param> 两个结点. 2 .紧急着,容创建一个 ServletContext ( servlet 上下文),这个 web 项目的所有部分都将共享这个上下文. 3 .容器将 <context-param> 转换为键值对,并交给 servletContext . 4 .容器创建 <li

SpringMVC将一个项目集成在另一个项目中

将KissfloveUtil项目集成在自己项目中.在pom.xml中加入以下配置: <dependencies> <dependency> <groupId>com.kissflove</groupId> <artifactId>kissfloveUtil</artifactId> <version>0.0.1</version> </dependency> </dependencies>

nginx + unicorn 部署rails项目

nginx + unicorn  部署 rails 项目,顾名思义要先安装nginx和unicorn 一 安装 安装nginx: sudo apt-get install nginx 安装unicorn: gem install unicorn 二 配置 1 在你项目的config文件夹下添加一个unicorn.rb文件,添加代码(样列:http://unicorn.bogomips.org/examples/unicorn.conf.rb) 我的如下: 1 module Rails 2 cla

Vue.js项目集成ElementUI

Vuejs实例-02Vue.js项目集成ElementUI Vuejs实例-02Vue.js项目集成ElementUI 0:前言 vue.js的UI组件库,在git上有多个项目,我见的使用者比较多的是iView和Element.两个组件库,组件都很丰富. 官网的介绍 iView: 一套基于 Vue.js 的高质量 UI 组件库 Element,一套为开发者.设计师和产品经理准备的基于 Vue 2.0 的组件库,提供了配套设计资源,帮助你的网站快速成型. 两者各有优缺点,不多评论,根据自己的需求,

新建以MySql为数据库的Rails项目

本文主要记录如何新建以MySql为数据库的Rails项目,以及过程中出现错误的解决方案 一.新建以MySql为数据库的Rails项目: $ rails new weibo -d mysql 二.发现报错,查看终端中错误信息如下: Gem::Ext::BuildError: ERROR: Failed to build gem native extension. Gem files will remain installed in /home/kolbe/.rbenv/versions/2.1.0

如何新建rails项目

这里新建的rails应用就叫news, (1)新建文件夹 $ mkdir news (2)指定本项目的ruby版本 cd news touch .ruby-version vim .ruby-version (3)使用rbenv的gemset,这样就可以把gem包都安装到项目目录的.bundle文件夹下了,(也可以给这个文件夹随意起其他名字,官网用的.gems) 具体的可以看 https://github.com/jf/rbenv-gemset git clone git://github.co

项目集成koala业务日志子系统

Koala平台的业务日志子系统是基于Maven的项目模块,最方便的集成是项目也使用Maven,war项目集成请自行下载jar包 前提 依赖spring 添加仓库 <repositories> <repository> <id>koala-releases</id> <url>http://nexus.openkoala.org/content/repositories/public-releases/</url> <releas

Appium&#183;项目集成

date:2018610 day14 一.项目集成 1.项目分层(以搜索下单为例) ①.测试数据 ②.关键字 ③.测试用例 将关键字组合起来,组合成一个搜索-消费测试用例 ④.用例模板 2.Tips ①.想要关键字.变量能被调用,要在资源下写关键字.变量 ②.在测试用例模板中,tearDown中要加Close All Applications ③.所有从网页上得到的内容,都是要Unicode形式获取,要将Unicode形式装换成Int型,直接  int(${a})即可 ④.RIDE不能直接计算,