顯示具有 Gem 標籤的文章。 顯示所有文章
顯示具有 Gem 標籤的文章。 顯示所有文章

2014年12月25日 星期四

到底哪個Rails Editor Gem 好用呢?

試了一下午終於找到我覺得功能夠強的Editor來幫助我親愛的網站使用者做出美美的頁面,雖然他檔案大了點,但是我想還是值得的,以下是我試過的幾個。

bootstrap-wysihtml5-rails

長的就像上面這個樣子,這是我最一開始用的,感覺滿簡潔的,但是要找個置中的按鈕都找不到,我就放棄了。

bootsy

和第一個比較起幾乎是照抄,所以一樣也出局了

tinymce-rails

這個功能很齊全,我不喜歡的地方在於因為要介面簡潔所以犠牲了方便性了,那些收起來的功能都要多點一下才會出現。


WYSIWYG

這個當初看到的時候覺得超美的就裝了起來,但是裝了之後很難整合進去HTML,而且更重要的是他要收費,免費使用只能用於非商業用途,所以就掰了。


.....最後我遇見了她

ckeditor-rails

功能齊全的啦,而且還有範本功能,即使不會HTML也可以排的美美的,但是他在上傳heroku的時候會比較慢一點,還有一些額外的東西要設定,不過我覺得他是最好用,而且中文化也超級容易的。

2014年11月17日 星期一

heroku省錢計劃 從clockwork到heroku scheduler配上delayed_job與workless

clockwork與delayed_job在heroku

他的問題就是要花很多錢,因為clockwork佔一個work,delayed_job也佔一個worker,heroku上只要你打開worker就開始算錢,即使你一天才跑一次,也是一樣,所以我用了heroku scheduler來取代clockwork,要注意的是他是best-effort service也是就他在很少的情況下可能不會執行,所以如果在如果你要執行的功能非常重要,那還是乖乖付錢用clockwork吧!,參考這篇


那delayed_job咧?

這時候就要用workless gem,他幫你在jobs都跑完的時候關掉worker,有jobs的時候打開worker,這樣就省了不少錢了,安裝方式看這裡


從clcokwork到heroku scheduler

clockwork用一個根目錄下的clockwork.rb來把工作加入排程,heroku scheduler就不一樣了,他用的是task,像下面這樣子。

# lib/tasks/scheduler.rake
desc "This task is called by the Heroku scheduler add-on"
task :check_times => :environment do
  puts "Checking Time Left..."
  ActionController::Base::ApplicationController.new.check_times
  puts "done."
end

特別要注意的是你的action是放在model裡面就可以像這樣叫他Model.check_times,但是如果是放在controller就要先建立instance才可以呼叫他,像上面寫的那樣,要有一個.new,接著執行下面的指令,再把每一個task輸入,舉例來說,上面的就要輸入rake check_times,時間到了就會自動把要執行的東西交給delayed_job了
heroku addons:open scheduler
當你打開worker的時候你的heroku免費750小時就開始減少了,所以測試完記得關掉喔


附註
在delayed_job執行的action如果有flash的訊息的話,log會出現一堆錯訊訊息,因為沒有request有flash也沒用,只要把flash刪掉就沒事了,當初我找了一陣子才知道的說。

2014年10月1日 星期三

在Rails利用Delayed Job與Clockwork定時執行action

話說我想要的功能是10秒鐘去檢查一次某項欄位的值,一開始把事情想的太簡單了,以為可以用什麼countdown或是timer的功能,後來才發現是和排程有關係的,雖然這兩個gem功能簡單好用,但是Delayed_JobClockwork在github的Readme也沒有很清楚,不過還是值得一看,所以特別寫這一篇來說明一下。


安裝Delayed job與Clockwork

在gemfile中加入這兩個gem

gem 'delayed_job_active_record'

gem 'clockwork'

執行bundle install,把他們安裝起來

delayed_job在排程上需要有一個jobs table來記錄排程,接著我們來產生這個table

rails generate delayed_job:active_record
rake db:migrate

為Clockwork指派任務

為什麼會需要兩個gem而不是一個呢?因為clockwork負責的是時間到的時候把任務再放入排程,他自己是沒辦法執行排程的工作的,排程的工作是由delayed job來負責的,現在在你的專案下新增一個clock.rb(也有人是放在lib裡面)。

require 'clockwork'
module Clockwork
  handler do |job|
    puts "Running #{job}"
  end

  # handler receives the time when job is prepared to run in the 2nd argument
  # handler do |job, time|
  #   puts "Running #{job}, at #{time}"
  # end
  every(10.seconds, "check_auction_times加入排程" ) { 
    ActionController::Base::ApplicationController.new.delay.check_times }
end

直接看到every那一行,10.seconds代表每10秒執行一次,後面接著是這項任務的名稱,自己可以隨意給你想要的名字,大括號內的東西是你要執行的action的位置,指定的方式是Module::Class.new.method_to_call,加上delay就是要放在排程的意思,以我的例子來看就是執行ApplicationController下面check_times這個action。


啟動Clockwork與Delayed job

打開你的console,執行下面指令


$ clockwork clock.rb
I, [2014-10-02T10:30:23.272561 #595]  INFO -- : Starting clock for 1 events: [ check_auction_times加入排程 ]
I, [2014-10-02T10:30:23.272684 #595]  INFO -- : Triggering 'check_auction_times加入排程'

還沒結束,你還要再開一個console把Delayed job也同時啟動


$ rake jobs:work
[Worker(host:nagamines-Mac-mini.local pid:606)] Starting job worker
[Worker(host:nagamines-Mac-mini.local pid:606)] Job ApplicationController#check_auction_times_without_delay (id=1230) RUNNING

這樣就搞定了,去試試你自己要的功能吧