終于終于我發(fā)布了一個(gè)Gem

雖然打成Gem的富文本編輯不少,但我喜歡的一個(gè)木有末盔。
勉強(qiáng)用的話(huà)筑舅,我會(huì)選ckeditor,但是它「太大陨舱,麻煩翠拣,顏值低」。

我喜歡的是這樣的編輯器是長(zhǎng)這樣的:


wangeditor

rubygems中有個(gè)老版本游盲,一年多沒(méi)有跟新了误墓,給作者發(fā)郵件蛮粮,提issue都沒(méi)有回復(fù)。不排除加班那啥的可能谜慌。

所以然想,每次使用,我都得

  1. 下載js
  2. require
  3. 寫(xiě)html和js

心累欣范。

一直想寫(xiě)自己寫(xiě)一個(gè)Gem变泄,把上面的123全都躲開(kāi)。
但是技能樹(shù)一直沒(méi)有點(diǎn)到恼琼,找到的教程又多是簡(jiǎn)單介紹一下妨蛹,完全不肯深入,給我?guī)?lái)了好幾次從入門(mén)到放棄的體驗(yàn)晴竞。
今天蛙卤,放棄的所謂的「未知解釋未知」,直接選擇了有逼格的(不要臉的)模仿(抄襲)噩死,像吃?shī)W利奧一樣「抄一抄表窘,改一改,點(diǎn)一點(diǎn)」甜滨,終于終于弄出了wangeditor_rails

得到的結(jié)論就是瘤袖,我不愧是一個(gè)山寨大國(guó)里面的人衣摩。沒(méi)有好的教材,沒(méi)有找到老師捂敌,抄襲絕逼是學(xué)習(xí)的好方法昌执。書(shū)抄百遍啄清,其義自見(jiàn)。

下面記錄一下,寫(xiě)Gem的步驟肄渗,一來(lái)備忘,二來(lái)看看是不是有誰(shuí)會(huì)搜到榛斯。

創(chuàng)建Gem的框架

我沒(méi)有是用bundle绊汹,而是使用的rails生成Gem的框架

rails plugin new Gem的名字

使用rails生成有一個(gè)好處,它會(huì)自動(dòng)在test目錄生成一個(gè)dummy的rails項(xiàng)目并在這個(gè)項(xiàng)目中引用你寫(xiě)得Gem奖慌。

下載wangEditor.js

直接

yarn init
yarn install wangeditor

填寫(xiě).gemspec文件

這個(gè)文件是Gem的說(shuō)明呀抛虫,git repo呀,什么的简僧,設(shè)置一下就OK

創(chuàng)建生成器

生成器就是平時(shí)我們敲rails g XXX的那個(gè)東西
使用devise建椰,simple_form的使用,我們都使用過(guò)岛马。
創(chuàng)建的這個(gè)生成器的目的就是當(dāng)敲入rails g wangeditor_rails:install的時(shí)候棉姐,將wangEditor.js拷貝到app/assets/javascripts中

# lib/generators/wangeditor/install/install_generator.rb
module Wangeditor
  class InstallGenerator < Rails::Generators::Base
  ┆ JAVASCRIPTS_FILE = "app/assets/javascripts/wangEditor.js"

  ┆ source_root File.expand_path("../../../../../", __FILE__)

  ┆ def copy_javascripts
      copy_file 'node_modules/wangeditor/release/wangEditor.js', JAVASCRIPTS_FILE
  ┆ end 

  end 
end

創(chuàng)建表單Helper

這樣在代碼是為了在view中使用<%= f.wangeditor :content %>

# lib/wangeditor_rails/helper.rb 
module WangeditorRails
  module Helper
    def wangeditor(name, method, options = {})
      content = options[:object][method]
      id = options[:id] || "#{name}_#{method}"
      name = "#{name}[#{method}]"
      #puts options

      output_buffer = ActiveSupport::SafeBuffer.new
      output_buffer << hidden_area(id, content, name)
      output_buffer << display_area(id, content)
      output_buffer << javascript_tag(create_scripts(id))
    end

    def hidden_area(id, content, name)
      content_tag :div, text_area_tag(id, content, name: name), style: 'display: none;'
    end

    def display_area(id, content)
      unless content.nil?
        content = sanitize content
      end
      content_tag(:div, content, id: "#{id}_editor")
    end

    def create_scripts(id)
      "var E = window.wangEditor
      var editor = new E('##{id}_editor')
      editor.customConfig.onchange = function (content) {
        document.getElementById('#{id}').value = content
      }
      editor.create()"
    end
  end

  module Builder
    def wangeditor(method, options = {})
      @template.send("wangeditor", @object_name, method, objectify_options(options))
    end
  end
end

綁定SimpleForm調(diào)用

這樣在代碼是為了在view中使用<%= f.input :content, as: :wangeditor %>

# lib/wangeditor_rails/simple_form.rb
module WangeditorRails
  module SimpleForm
    class WangeditorInput < ::SimpleForm::Inputs::Base
      def input(wrapper_options)
        @builder.wangeditor(attribute_name, input_html_options)
      end
    end
  end
end

::SimpleForm::FormBuilder.map_type :wangeditor, :to => WangeditorRails::SimpleForm::WangeditorInput

在rails引用

上面寫(xiě)得表單方法不能直接使用屠列,需要往rails里「注冊(cè)」一下

# lib/wangeditor_rails/engine.rb
require "wangeditor_rails"
require "rails"

module WangeditorRails
  class Engine < Rails::Engine

    initializer "wangeditor_rails.helper_and_builder" do
      ActiveSupport.on_load :action_view do
        ActionView::Base.send(:include, WangeditorRails::Helper)
        ActionView::Helpers::FormBuilder.send(:include, WangeditorRails::Builder)
      end
    end

    initializer "wangeditor_rails.simple_form" do
      require "wangeditor_rails/simple_form" if Object.const_defined?("SimpleForm")
    end
  end
end

在Gem核心文件中引用

# lib/wangeditor_rails.rb 

require 'wangeditor_rails/engine'
require 'wangeditor_rails/helper'

module WangeditorRails
end

OVER

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伞矩,隨后出現(xiàn)的幾起案子笛洛,更是在濱河造成了極大的恐慌,老刑警劉巖扭吁,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撞蜂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侥袜,警方通過(guò)查閱死者的電腦和手機(jī)蝌诡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)枫吧,“玉大人浦旱,你說(shuō)我怎么就攤上這事【旁樱” “怎么了颁湖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)例隆。 經(jīng)常有香客問(wèn)我甥捺,道長(zhǎng),這世上最難降的妖魔是什么镀层? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任镰禾,我火速辦了婚禮,結(jié)果婚禮上唱逢,老公的妹妹穿的比我還像新娘吴侦。我一直安慰自己,他們只是感情好坞古,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布备韧。 她就那樣靜靜地躺著,像睡著了一般痪枫。 火紅的嫁衣襯著肌膚如雪织堂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天听怕,我揣著相機(jī)與錄音捧挺,去河邊找鬼。 笑死尿瞭,一個(gè)胖子當(dāng)著我的面吹牛闽烙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼黑竞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捕发!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起很魂,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扎酷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后遏匆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體法挨,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年幅聘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凡纳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡帝蒿,死狀恐怖荐糜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葛超,我是刑警寧澤暴氏,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站绣张,受9級(jí)特大地震影響答渔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜侥涵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一研儒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧独令,春花似錦、人聲如沸好芭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舍败。三九已至招狸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邻薯,已是汗流浹背裙戏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厕诡,地道東北人累榜。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親壹罚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葛作,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • React.js的Rails開(kāi)發(fā)者指南 原作者:Fernando Villalobos 原文鏈接:https://...
    不知道為啥被屏蔽閱讀 3,674評(píng)論 0 24
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)猖凛,斷路器赂蠢,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評(píng)論 25 707
  • 圣誕節(jié)的清晨,七點(diǎn)醒后又睡了辨泳,又是在美夢(mèng)中醒來(lái)虱岂。 今天特別想聽(tīng)杜月笙的故事,因?yàn)槭俏夷猩竦呐枷癫ず欤卺谑窃谙柴R...
    朱雨哲閱讀 90評(píng)論 0 0
  • 有沒(méi)有一個(gè)人绍傲,他對(duì)你很貼心,很容忍耍共,很照顧烫饼,但是你們真的可以做好朋友嗎? 有時(shí)候试读,他人對(duì)你的忍耐和包容不是你放縱和...
    伊生歡閱讀 173評(píng)論 0 0