If you’ve ever used the ckeditor gem , you probably already know this gem only supports ckeditor 4, which means that many of the features of the new ckeditor versions are not provided in this gem
. One of them is the lack of direct integration of CKFinder – a feature to manage files uploaded as a media library very friendly:
Up to now, I still have not found a way to integrate CKFinder with gem ckeditor
, so I had to use photo, video and audio upload plugins available on ckeditor. And the real problem lies in the ckeditor’s upload files . By default, gem ckeditor
will only divide you with 2 folders: pictures, attachment_files
corresponding to 2 upload processing pages.
1 2 3 4 5 6 | <span class="token comment">#ckeditor-4.2.4/routes.rb</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Engine</span> <span class="token punctuation">.</span> routes <span class="token punctuation">.</span> draw <span class="token keyword">do</span> resources <span class="token symbol">:pictures</span> <span class="token punctuation">,</span> only <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token symbol">:index</span> <span class="token punctuation">,</span> <span class="token symbol">:create</span> <span class="token punctuation">,</span> <span class="token symbol">:destroy</span> <span class="token punctuation">]</span> resources <span class="token symbol">:attachment_files</span> <span class="token punctuation">,</span> only <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token symbol">:index</span> <span class="token punctuation">,</span> <span class="token symbol">:create</span> <span class="token punctuation">,</span> <span class="token symbol">:destroy</span> <span class="token punctuation">]</span> <span class="token keyword">end</span> |
Thus, when you use the plugin to upload video
, audio
, and formats other than pictures, the gem ckeditor
will use the same page /attachment_files
to handle the upload.
That means, video, audio, pdf, … files will be saved in the same folder; This is not good in many cases. Therefore, in this article, I will guide you to custom gem ckeditor
to be able to create a separate processing page for audio files (the same applies to a file types other than pictures).
1. Create project rails and install gem ckeditor
First, create a Rails application with this command (this demo only uses Rails 5, specifically the version 5.2.1):
1 2 | rails _5.2.1_ new ckeditor_demo |
In Gemfile
you install ckeditor gem and its dependencies:
1 2 3 4 | gem <span class="token string">'ckeditor'</span> <span class="token punctuation">,</span> <span class="token string">'4.2.4'</span> gem <span class="token string">'carrierwave'</span> <span class="token punctuation">,</span> <span class="token string">'1.1.0'</span> gem <span class="token string">'mini_magick'</span> <span class="token punctuation">,</span> <span class="token string">'4.7.0'</span> |
then run:
1 2 3 | bundle install rails generate ckeditor:install --orm=active_record --backend=carrierwave |
You can download file ckeditor_custom.js
version 4.6.1 on cdn here . Then create a config.js
file as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token constant">CKEDITOR</span> <span class="token punctuation">.</span> editorConfig <span class="token operator">=</span> <span class="token function">function</span> <span class="token punctuation">(</span> config <span class="token punctuation">)</span> <span class="token punctuation">{</span> config <span class="token punctuation">.</span> validateSize <span class="token operator">=</span> <span class="token number">100</span> <span class="token punctuation">;</span> config <span class="token punctuation">.</span> filebrowserImageUploadUrl <span class="token operator">=</span> <span class="token string">"/ckeditor/pictures"</span> <span class="token punctuation">;</span> config <span class="token punctuation">.</span> filebrowserImageBrowseUrl <span class="token operator">=</span> <span class="token string">"/ckeditor/pictures"</span> <span class="token punctuation">;</span> config <span class="token punctuation">.</span> toolbar_Pure <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'clipboard'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'-'</span> <span class="token punctuation">,</span> <span class="token string">'Undo'</span> <span class="token punctuation">,</span> <span class="token string">'Redo'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'tools'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'Maximize'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'basicstyles'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'Bold'</span> <span class="token punctuation">,</span> <span class="token string">'Italic'</span> <span class="token punctuation">,</span> <span class="token string">'Underline'</span> <span class="token punctuation">,</span> <span class="token string">'Strike'</span> <span class="token punctuation">,</span> <span class="token string">'Subscript'</span> <span class="token punctuation">,</span> <span class="token string">'Superscript'</span> <span class="token punctuation">,</span> <span class="token string">'-'</span> <span class="token punctuation">,</span> <span class="token string">'RemoveFormat'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'paragraph'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'NumberedList'</span> <span class="token punctuation">,</span> <span class="token string">'BulletedList'</span> <span class="token punctuation">,</span> <span class="token string">'-'</span> <span class="token punctuation">,</span> <span class="token string">'Outdent'</span> <span class="token punctuation">,</span> <span class="token string">'Indent'</span> <span class="token punctuation">,</span> <span class="token string">'-'</span> <span class="token punctuation">,</span> <span class="token string">'-'</span> <span class="token punctuation">,</span> <span class="token string">'JustifyLeft'</span> <span class="token punctuation">,</span> <span class="token string">'JustifyCenter'</span> <span class="token punctuation">,</span> <span class="token string">'JustifyRight'</span> <span class="token punctuation">,</span> <span class="token string">'JustifyBlock'</span> <span class="token punctuation">,</span> <span class="token string">'-'</span> <span class="token punctuation">,</span> <span class="token string">'BidiLtr'</span> <span class="token punctuation">,</span> <span class="token string">'BidiRtl'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'links'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'Link'</span> <span class="token punctuation">,</span> <span class="token string">'Unlink'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'styles'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'Styles'</span> <span class="token punctuation">,</span> <span class="token string">'Format'</span> <span class="token punctuation">,</span> <span class="token string">'Font'</span> <span class="token punctuation">,</span> <span class="token string">'FontSize'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'colors'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'TextColor'</span> <span class="token punctuation">,</span> <span class="token string">'BGColor'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'insert'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'Image'</span> <span class="token punctuation">,</span> <span class="token string">'Video'</span> <span class="token punctuation">,</span> <span class="token string">'Iframe'</span> <span class="token punctuation">,</span> <span class="token string">'Audio'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> config <span class="token punctuation">.</span> toolbar <span class="token operator">=</span> <span class="token string">'Pure'</span> <span class="token punctuation">;</span> config <span class="token punctuation">.</span> toolbar_mini <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'tools'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'Maximize'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'basicstyles'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'Bold'</span> <span class="token punctuation">,</span> <span class="token string">'Italic'</span> <span class="token punctuation">,</span> <span class="token string">'Underline'</span> <span class="token punctuation">,</span> <span class="token string">'Strike'</span> <span class="token punctuation">,</span> <span class="token string">'Subscript'</span> <span class="token punctuation">,</span> <span class="token string">'Superscript'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'paragraph'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'NumberedList'</span> <span class="token punctuation">,</span> <span class="token string">'BulletedList'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'links'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'Link'</span> <span class="token punctuation">,</span> <span class="token string">'Unlink'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'styles'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'Styles'</span> <span class="token punctuation">,</span> <span class="token string">'Format'</span> <span class="token punctuation">,</span> <span class="token string">'Font'</span> <span class="token punctuation">,</span> <span class="token string">'FontSize'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> |
You put the 2 files above into 2 directories: app/assets/javascripts/ckeditor_custom.js
, app/assets/javascripts/ckeditor/config.js
and put it into application.js
1 2 3 4 | <span class="token operator">/</span> <span class="token operator">/</span> <span class="token operator">=</span> <span class="token keyword">require</span> ckeditor <span class="token operator">/</span> config <span class="token operator">/</span> <span class="token operator">/</span> <span class="token operator">=</span> <span class="token keyword">require</span> ckeditor <span class="token operator">/</span> init <span class="token operator">/</span> <span class="token operator">/</span> <span class="token operator">=</span> <span class="token keyword">require</span> ckeditor_custom |
Now we create a page to create the following article:
1 2 3 4 5 6 | <span class="token comment">#routes.rb</span> <span class="token constant">Rails</span> <span class="token punctuation">.</span> application <span class="token punctuation">.</span> routes <span class="token punctuation">.</span> draw <span class="token keyword">do</span> mount <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Engine</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">'/ckeditor'</span> resource <span class="token symbol">:articles</span> <span class="token keyword">end</span> |
1 2 3 4 5 6 7 | <span class="token comment">#articles_controller.rb</span> <span class="token keyword">class</span> <span class="token class-name">ArticlesController</span> <span class="token operator"><</span> <span class="token constant">ApplicationController</span> <span class="token keyword">def</span> <span class="token keyword">new</span> <span class="token variable">@article</span> <span class="token operator">=</span> <span class="token constant">Article</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token class-name">end</span> <span class="token keyword">end</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #views/new.html/erb <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> col-md-4 <span class="token punctuation">"</span></span> <span class="token style-attr language-css"><span class="token attr-name"> <span class="token attr-name">style</span></span> <span class="token punctuation">="</span> <span class="token attr-value"><span class="token property">padding</span> <span class="token punctuation">:</span> 88px 0 0 85px <span class="token punctuation">;</span></span> <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <%= form_for @article do |f|%> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> form-group <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <%= f.label :title, "Title: " %> <%= f.text_field :title, class: "form-control" %> <%= render "error_field", field: :title %> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> form-group <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <%= f.label :content, "Content: " %> <%= f.cktext_area :content, class: "form-control", ckeditor: { toolbar: 'Pure' } %> <%= render "error_field", field: :content %> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <%= f.submit "Submit" %> <% end %> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> |
Ok that’s it, now we’re going to have a view like this: As you can see, the ckeditor toolbar already has an insert images button, so we don’t need to download the plugin anymore. Now I will integrate the video
plugin and make it a separate upload processing page.
2. Integrate the video plugin into the ckeditor toolbar
First, download the video plugin here and extract it into app/assets/javascripts/ckeditor/plugins/
. Then add this line config.js
file:
1 2 | config <span class="token punctuation">.</span> extraPlugins <span class="token operator">=</span> <span class="token string">'video'</span> <span class="token punctuation">;</span> |
In the toolbar of the config.js
file remember to add the Video
item for example:
1 2 3 4 | config <span class="token punctuation">.</span> toolbar_Pure <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">'insert'</span> <span class="token punctuation">,</span> items <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token string">'Image'</span> <span class="token punctuation">,</span> <span class="token string">'Video'</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">]</span> |
Au kay, now we have a video upload button like this: As you can see, it doesn’t have a Browse Server
button to upload files yet, because I haven’t configured the server path for the video
plugin. Now I try to add these 2 lines to the config.js
file:
1 2 3 | config <span class="token punctuation">.</span> filebrowserVideoUploadUrl <span class="token operator">=</span> <span class="token string">"/ckeditor/attachment_files"</span> <span class="token punctuation">;</span> config <span class="token punctuation">.</span> filebrowserVideoBrowseUrl <span class="token operator">=</span> <span class="token string">"/ckeditor/attachment_files"</span> <span class="token punctuation">;</span> |
And now we can upload videos to the content
of the article, but there is one thing that is not good: As you can see, I added the path /ckeditor/attachment_files
to make the path for the server to upload the video. However, this server is used to upload doc, docx, xls, odt, ods, pdf, rar, zip, tar, tar.gz, sw
so it has implemented a validate extension that prevents the .mp4
file from being uploaded to the server. So we try to replace the two links above with /ckeditor/videos
.
1 2 3 | config <span class="token punctuation">.</span> filebrowserVideoUploadUrl <span class="token operator">=</span> <span class="token string">"/ckeditor/videos"</span> <span class="token punctuation">;</span> config <span class="token punctuation">.</span> filebrowserVideoBrowseUrl <span class="token operator">=</span> <span class="token string">"/ckeditor/videos"</span> <span class="token punctuation">;</span> |
The result is :
As you can see, Rails states that our application does not have /ckeditor/videos
. So in part 3, I will guide you to create this page.
3. Create video upload page based on gem ckeditor.
The idea is very simple, the video upload page identical pages to upload images
or attachment_files
available in gem ckeditor
.The you need to do is just open sourecode
of it and copy code of the page to upload images
on the directory app
, where necessary fix images
into video
then we fix.
First, add routes
to the video upload page, in the routes.rb
file:
1 2 3 4 5 6 7 8 | <span class="token constant">Rails</span> <span class="token punctuation">.</span> application <span class="token punctuation">.</span> routes <span class="token punctuation">.</span> draw <span class="token keyword">do</span> mount <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Engine</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token string">'/ckeditor'</span> resource <span class="token symbol">:articles</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Engine</span> <span class="token punctuation">.</span> routes <span class="token punctuation">.</span> draw <span class="token keyword">do</span> resources <span class="token symbol">:videos</span> <span class="token punctuation">,</span> only <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token symbol">:index</span> <span class="token punctuation">,</span> <span class="token symbol">:create</span> <span class="token punctuation">,</span> <span class="token symbol">:destroy</span> <span class="token punctuation">]</span> <span class="token keyword">end</span> <span class="token keyword">end</span> |
The uploaded files in Ckeditor
‘s content are saved to the database thanks to the Ckeditor:Asset
model. Ckeditor:Picture
and Ckeditor:AttachmentFile
models inherit from the Ckeditor:Asset
model, so we create a Ckeditor:Video
model Ckeditor:Video
similar to the following:
1 2 3 4 5 6 7 8 | <span class="token comment">#models/asset.rb</span> <span class="token keyword">class</span> <span class="token class-name">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Asset</span> <span class="token operator"><</span> <span class="token constant">ActiveRecord</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Base</span> include <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Orm</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">ActiveRecord</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">AssetBase</span> delegate <span class="token symbol">:url</span> <span class="token punctuation">,</span> <span class="token symbol">:current_path</span> <span class="token punctuation">,</span> <span class="token symbol">:content_type</span> <span class="token punctuation">,</span> to <span class="token punctuation">:</span> <span class="token symbol">:data</span> validates <span class="token symbol">:data</span> <span class="token punctuation">,</span> presence <span class="token punctuation">:</span> <span class="token keyword">true</span> <span class="token keyword">end</span> |
1 2 3 4 5 6 7 | <span class="token keyword">class</span> <span class="token class-name">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Video</span> <span class="token operator"><</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Asset</span> mount_uploader <span class="token symbol">:data</span> <span class="token punctuation">,</span> <span class="token constant">CkeditorVideoUploader</span> <span class="token punctuation">,</span> mount_on <span class="token punctuation">:</span> <span class="token symbol">:data_file_name</span> <span class="token keyword">def</span> url_thumb <span class="token variable">@url_thumb</span> <span class="token operator">||</span> <span class="token operator">=</span> <span class="token constant">ActionController</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Base</span> <span class="token punctuation">.</span> helpers <span class="token punctuation">.</span> <span class="token function">asset_path</span> <span class="token punctuation">(</span> <span class="token string">"video.png"</span> <span class="token punctuation">)</span> <span class="token keyword">end</span> <span class="token keyword">end</span> |
Create a thumbnail file app/assets/images/video.png.
to display on the video upload list screen. You can download the file here. Create an uploader
for the aforementioned model:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token comment"># frozen_string_literal: true</span> <span class="token keyword">require</span> <span class="token string">'carrierwave'</span> <span class="token keyword">class</span> <span class="token class-name">CkeditorVideoUploader</span> <span class="token operator"><</span> <span class="token constant">CarrierWave</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Uploader</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Base</span> include <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Backend</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">CarrierWave</span> <span class="token comment"># Include RMagick or ImageScience support:</span> <span class="token comment"># include CarrierWave::RMagick</span> <span class="token comment"># include CarrierWave::MiniMagick</span> <span class="token comment"># include CarrierWave::ImageScience</span> <span class="token comment"># Choose what kind of storage to use for this uploader:</span> storage <span class="token symbol">:file</span> <span class="token keyword">def</span> store_dir <span class="token string">"uploads/ckeditor/videos/ <span class="token interpolation"><span class="token delimiter tag">#{</span> model <span class="token punctuation">.</span> id <span class="token delimiter tag">}</span></span> "</span> <span class="token keyword">end</span> <span class="token keyword">def</span> extension_white_list <span class="token constant">Ckeditor</span> <span class="token punctuation">.</span> video_types <span class="token keyword">end</span> <span class="token keyword">end</span> |
Add extension type to video in file ckeditor.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | <span class="token keyword">require</span> <span class="token string">'active_support/json/encoding'</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">.</span> module_eval <span class="token keyword">do</span> mattr_accessor <span class="token symbol">:video_file_types</span> <span class="token punctuation">,</span> <span class="token symbol">:audio_file_types</span> <span class="token keyword">end</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">.</span> setup <span class="token keyword">do</span> <span class="token operator">|</span> config <span class="token operator">|</span> <span class="token keyword">require</span> <span class="token string">'ckeditor/orm/active_record'</span> config <span class="token punctuation">.</span> video_file_types <span class="token operator">=</span> <span class="token string">%w(mp4 avi webm)</span> <span class="token keyword">end</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Utils</span> <span class="token punctuation">.</span> module_eval <span class="token keyword">do</span> <span class="token keyword">class</span> <span class="token class-name">JavascriptCode</span> <span class="token operator"><</span> <span class="token builtin">String</span> <span class="token keyword">def</span> <span class="token function">as_json</span> <span class="token punctuation">(</span> _options <span class="token operator">=</span> <span class="token keyword">nil</span> <span class="token punctuation">)</span> <span class="token keyword">self</span> <span class="token keyword">end</span> <span class="token keyword">def</span> <span class="token function">encode_json</span> <span class="token punctuation">(</span> _encoder <span class="token punctuation">)</span> <span class="token keyword">self</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">class</span> <span class="token operator"><</span> <span class="token operator"><</span> <span class="token keyword">self</span> <span class="token keyword">def</span> <span class="token function">js_fileuploader</span> <span class="token punctuation">(</span> uploader_type <span class="token punctuation">,</span> options <span class="token operator">=</span> <span class="token punctuation">{</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> options <span class="token operator">=</span> <span class="token punctuation">{</span> multiple <span class="token punctuation">:</span> <span class="token keyword">true</span> <span class="token punctuation">,</span> element <span class="token punctuation">:</span> <span class="token string">'fileupload'</span> <span class="token punctuation">,</span> sizeLimit <span class="token punctuation">:</span> <span class="token number">1000000000</span> <span class="token punctuation">}</span> <span class="token punctuation">.</span> merge <span class="token operator">!</span> <span class="token punctuation">(</span> options <span class="token punctuation">)</span> <span class="token keyword">case</span> uploader_type <span class="token punctuation">.</span> to_s <span class="token punctuation">.</span> downcase <span class="token keyword">when</span> <span class="token string">'image'</span> <span class="token keyword">then</span> options <span class="token punctuation">[</span> <span class="token symbol">:action</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token constant">JavascriptCode</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token string">'EDITOR.config.filebrowserImageUploadUrl'</span> <span class="token punctuation">)</span> options <span class="token punctuation">[</span> <span class="token symbol">:allowedExtensions</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">.</span> image_file_types <span class="token keyword">when</span> <span class="token string">'flash'</span> <span class="token keyword">then</span> options <span class="token punctuation">[</span> <span class="token symbol">:action</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token constant">JavascriptCode</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token string">'EDITOR.config.filebrowserFlashUploadUrl'</span> <span class="token punctuation">)</span> options <span class="token punctuation">[</span> <span class="token symbol">:allowedExtensions</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">.</span> flash_file_types <span class="token keyword">when</span> <span class="token string">'video'</span> <span class="token keyword">then</span> options <span class="token punctuation">[</span> <span class="token symbol">:action</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token constant">JavascriptCode</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token string">'EDITOR.config.filebrowserVideoUploadUrl'</span> <span class="token punctuation">)</span> options <span class="token punctuation">[</span> <span class="token symbol">:allowedExtensions</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">.</span> video_file_types <span class="token keyword">else</span> options <span class="token punctuation">[</span> <span class="token symbol">:action</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token constant">JavascriptCode</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token string">'EDITOR.config.filebrowserUploadUrl'</span> <span class="token punctuation">)</span> options <span class="token punctuation">[</span> <span class="token symbol">:allowedExtensions</span> <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">.</span> attachment_file_types <span class="token keyword">end</span> js_options <span class="token operator">=</span> <span class="token constant">ActiveSupport</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">JSON</span> <span class="token punctuation">.</span> <span class="token function">encode</span> <span class="token punctuation">(</span> options <span class="token punctuation">)</span> js_options <span class="token punctuation">.</span> gsub <span class="token operator">!</span> <span class="token punctuation">(</span> <span class="token regex">/"(EDITOR.config.filebrowser(Image|Flash|Video|Audio|)UploadUrl)"/</span> <span class="token punctuation">,</span> <span class="token string">'1'</span> <span class="token punctuation">)</span> <span class="token string">"(function() { new qq.FileUploaderInput( <span class="token interpolation"><span class="token delimiter tag">#{</span> js_options <span class="token delimiter tag">}</span></span> ); }).call(this);"</span> <span class="token punctuation">.</span> html_safe <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">end</span> |
Add controller to handle upload:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <span class="token comment">#app/controllers/ckeditor/application_controller.rb</span> <span class="token keyword">class</span> <span class="token class-name">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">ApplicationController</span> <span class="token operator"><</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">.</span> parent_controller <span class="token punctuation">.</span> constantize layout <span class="token constant">Ckeditor</span> <span class="token punctuation">.</span> controller_layout before_action <span class="token symbol">:find_asset</span> <span class="token punctuation">,</span> only <span class="token punctuation">:</span> <span class="token punctuation">[</span> <span class="token symbol">:destroy</span> <span class="token punctuation">]</span> before_action <span class="token symbol">:ckeditor_authorize!</span> before_action <span class="token symbol">:authorize_resource</span> <span class="token keyword">protected</span> <span class="token keyword">def</span> <span class="token function">respond_with_asset</span> <span class="token punctuation">(</span> asset <span class="token punctuation">)</span> asset_response <span class="token operator">=</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">AssetResponse</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> asset <span class="token punctuation">,</span> request <span class="token punctuation">)</span> <span class="token keyword">if</span> asset <span class="token punctuation">.</span> save render asset_response <span class="token punctuation">.</span> <span class="token function">success</span> <span class="token punctuation">(</span> config <span class="token punctuation">.</span> relative_url_root <span class="token punctuation">)</span> <span class="token keyword">else</span> render asset_response <span class="token punctuation">.</span> errors <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">def</span> check_role_type <span class="token keyword">return</span> redirect_to root_path <span class="token keyword">if</span> current_admin <span class="token punctuation">.</span> just_can_view <span class="token operator">?</span> <span class="token keyword">end</span> <span class="token keyword">end</span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <span class="token comment">#app/controllers/ckeditor/videos_controller.rb</span> <span class="token keyword">class</span> <span class="token class-name">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">VideosController</span> <span class="token operator"><</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">ApplicationController</span> skip_before_action <span class="token symbol">:verify_authenticity_token</span> <span class="token punctuation">,</span> only <span class="token punctuation">:</span> <span class="token symbol">:create</span> <span class="token punctuation">,</span> <span class="token keyword">raise</span> <span class="token punctuation">:</span> <span class="token keyword">false</span> <span class="token keyword">def</span> index <span class="token variable">@videos</span> <span class="token operator">=</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Video</span> <span class="token punctuation">.</span> to_adapter <span class="token punctuation">.</span> <span class="token function">find_all</span> <span class="token punctuation">(</span> ckeditor_filebrowser_scope <span class="token punctuation">)</span> <span class="token variable">@videos</span> <span class="token operator">=</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Paginatable</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token variable">@videos</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">page</span> <span class="token punctuation">(</span> params <span class="token punctuation">[</span> <span class="token symbol">:page</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> respond_to <span class="token keyword">do</span> <span class="token operator">|</span> format <span class="token operator">|</span> format <span class="token punctuation">.</span> html <span class="token punctuation">{</span> render layout <span class="token punctuation">:</span> <span class="token variable">@videos</span> <span class="token punctuation">.</span> first_page <span class="token operator">?</span> <span class="token punctuation">}</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">def</span> create <span class="token variable">@video</span> <span class="token operator">=</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Video</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token class-name">respond_with_asset</span> <span class="token punctuation">(</span> <span class="token variable">@video</span> <span class="token punctuation">)</span> <span class="token keyword">end</span> <span class="token keyword">def</span> destroy <span class="token variable">@video</span> <span class="token punctuation">.</span> destroy respond_to <span class="token keyword">do</span> <span class="token operator">|</span> format <span class="token operator">|</span> format <span class="token punctuation">.</span> html <span class="token punctuation">{</span> redirect_to videos_path <span class="token punctuation">}</span> format <span class="token punctuation">.</span> json <span class="token punctuation">{</span> render json <span class="token punctuation">:</span> <span class="token variable">@video</span> <span class="token punctuation">,</span> status <span class="token punctuation">:</span> <span class="token number">204</span> <span class="token punctuation">}</span> <span class="token keyword">end</span> <span class="token keyword">end</span> <span class="token keyword">protected</span> <span class="token keyword">def</span> find_asset <span class="token variable">@video</span> <span class="token operator">=</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Video</span> <span class="token punctuation">.</span> to_adapter <span class="token punctuation">.</span> get <span class="token operator">!</span> <span class="token punctuation">(</span> params <span class="token punctuation">[</span> <span class="token symbol">:id</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token keyword">end</span> <span class="token keyword">def</span> authorize_resource model <span class="token operator">=</span> <span class="token punctuation">(</span> <span class="token variable">@video</span> <span class="token operator">||</span> <span class="token constant">Ckeditor</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Video</span> <span class="token punctuation">)</span> <span class="token variable">@authorization_adapter</span> <span class="token punctuation">.</span> <span class="token function">try</span> <span class="token punctuation">(</span> <span class="token symbol">:authorize</span> <span class="token punctuation">,</span> params <span class="token punctuation">[</span> <span class="token symbol">:action</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> model <span class="token punctuation">)</span> <span class="token keyword">end</span> <span class="token keyword">end</span> |
Add a view for the upload page:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #views/ckeditor/videos/index.html.erb <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">id</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> fileupload <span class="token punctuation">"</span></span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> gal-holder <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> gal-item <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> fileupload-button gal-upload-holder <span class="token punctuation">"</span></span> <span class="token style-attr language-css"><span class="token attr-name"> <span class="token attr-name">style</span></span> <span class="token punctuation">="</span> <span class="token attr-value"><span class="token property">height</span> <span class="token punctuation">:</span> 150px <span class="token punctuation">;</span></span> <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <%= link_to I18n.t(:upload, scope: [:ckeditor, :buttons]), 'javascript:void(0)', class: "add" %> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> fileupload-list <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <%= render partial: 'ckeditor/shared/asset', collection: @videos %> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <% unless @videos.last_page? %> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> pagination <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <%= link_to I18n.t("ckeditor.buttons.next"), ckeditor.videos_path(page: @videos.next_page), class: "next", rel: "next" %> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <% end -%> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token attr-name">type</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> text/javascript <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token script language-javascript"> <span class="token operator"><</span> <span class="token operator">%=</span> Ckeditor <span class="token punctuation">:</span> <span class="token punctuation">:</span> Utils <span class="token punctuation">.</span> <span class="token function">js_fileuploader</span> <span class="token punctuation">(</span> <span class="token string">'video'</span> <span class="token punctuation">)</span> <span class="token operator">%</span> <span class="token operator">></span> </span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #views/ckeditor/shared/_asset_tmpl.html.erb <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> script</span> <span class="token attr-name">id</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> fileupload_tmpl <span class="token punctuation">"</span></span> <span class="token attr-name">type</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> text/x-jquery-tmpl <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token script language-javascript"> <span class="token operator"><</span> div id <span class="token operator">=</span> <span class="token string">"asset_${id}"</span> <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"gal-item"</span> data <span class="token operator">-</span> url <span class="token operator">=</span> <span class="token string">"${url_content}"</span> <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"fileupload-file gal-inner-holder"</span> style <span class="token operator">=</span> <span class="token string">"height: 150px;"</span> <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"img"</span> <span class="token operator">></span> <span class="token operator"><</span> img src <span class="token operator">=</span> <span class="token string">"${url_thumb}"</span> title <span class="token operator">=</span> <span class="token string">"${filename}"</span> width <span class="token operator">=</span> <span class="token string">"100%"</span> height <span class="token operator">=</span> <span class="token string">"100%"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"img-data"</span> <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"img-name"</span> <span class="token operator">></span> $ <span class="token punctuation">{</span> filename <span class="token punctuation">.</span> <span class="token function">substring</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">,</span> <span class="token number">14</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">'...'</span> <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"time-size"</span> <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"time"</span> <span class="token operator">></span> $ <span class="token punctuation">{</span> format_created_at <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token string">"fileupload-size size"</span> <span class="token operator">></span> $ <span class="token punctuation">{</span> size <span class="token punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> </span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> script</span> <span class="token punctuation">></span></span> |
1 2 3 4 5 6 7 8 9 10 11 12 13 | <%= content_tag(:div, id: dom_id(asset), class: "gal-item", data: { url: image_path(asset.url_content) }) do %> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> fileupload-file gal-inner-holder <span class="token punctuation">"</span></span> <span class="token style-attr language-css"><span class="token attr-name"> <span class="token attr-name">style</span></span> <span class="token punctuation">="</span> <span class="token attr-value"><span class="token property">height</span> <span class="token punctuation">:</span> 150px <span class="token punctuation">;</span></span> <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> img <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <%= image_tag(asset.url_thumb, title: asset.filename, style: "width:100%;height: 100%;") %> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> img-data <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> img-name <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <%= truncate(asset.filename, length: 17) %> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> time-size <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> time <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <%= asset.format_created_at %> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation">=</span> <span class="token punctuation">"</span> fileupload-size size <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <%= number_to_human_size(asset.size) if asset.size %> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <% end %> |
That’s it, and now we can upload our pretty videos into the content: You can completely do the same thing with audio plugins, links, …. The article here is over, hope it is useful for you.
References: https://github.com/galetahub/ckeditor