目前分類:Rails Trick (16)

瀏覽方式: 標題列表 簡短摘要

最近遇到困擾,下 gem list 會出現很多重複安裝的 rubygems ,是版本不同升級遺留下來。

一個個去 gem uninstall 刪除有點繁瑣,找找 gem command 文件 之後發現可以直接下:

(sudo) gem cleanup

如果你 gem 是裝在系統就要加 sudo

會幫你把重複安裝的版本刪除,不過請自己小心刪到不該刪的囉!

ps. 我測試時發現指令下 clean 或是 cleanup 都可以

 

參考連結:
gem cleanup 使用說明
如何刪除 Rails 3 pre 與相關的 gems

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

Ruby 本身有 kernel method :rand 可以使用,但是只能拉出 array 內的1個隨機 entry。

這時候可以這樣下:

temp_array = [1,2,3,4,5]
temp_array.sort_by {rand}

結果範例:[4, 1, 3, 2, 5]

 

如果想寫成 Array 的 method:

class Array
  def shuffle
    sort_by { rand }
  end

  def shuffle!
    self = shuffle
  end
end

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

Rails Best Practices 最佳實踐,對於想要精進 Rails 的 programmer 是其中一項不可或缺的訓練。
常常聽到長輩們告誡,要練到寫出來就已經大致符合 best practices,把這些寫法內化成習慣。

關於最佳實踐,ihower 長輩已經有整理出文章與投影片,可以邊看邊檢查自己的程式需要修改的地方

Rails Best Practices 投影片(ihower blog文章)
Rails Best Practices(ihower演講的投影片,非常實用!)

最近看到國外已經成立了一個網站,專門討論 Rails Best Practices,甚至還有人寫成 gem,可以直接幫你檢查程式裡面有哪些地方不符合最佳實踐的地方。

Rails Best Practices | rails best practices list
flyerhzm's rails_best_practices at master - GitHub

只要去 sudo gem install rails_best_practices ,再到 rails 專案的根目錄下 rails_best_practices . 就會自動幫你抓出要修改的地方囉!

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

irb / rails console 是大家寫 Ruby / Rails 的好朋友,現在有人提供加強這個強大工具的方法啦

Improve IRB (and fix it on mac OS X)

這個方法需要安裝2個 gem,wirblehirb,並在你的 home 目錄下增加/修改 .irbrc
.irbrc 的內容就請到上面的連結去複製啦,完成後你的 irb 就會自動做漂亮的排版了!

如果還想額外做調整的話,.irbrc 內可以自己寫一些敘述,把剛才下的指令的 sql 顯示出來(Rails 比較常用到)。 

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

參考文章:use rails helper methods in controller

有時候在 script/console 中,或是 controller 內會用到已經寫好的 helper method,像筆者最近遇到要使用 strip_tags,但是要怎麼叫出來用呢?

一、在 controller 中,有一個叫 @template 的 instance variable 可以用來呼叫 helper method,範例程式如下:

class BlahController < ApplicationController
  def process_text
    @html = "<p><strong>fgnfgbaf</strong>gafwadsfgewrgtdfgerge</p>"
    @ascii = @template.strip_tags(@html) #呼叫 strip_tags 這個 helper method 
    ..
  end
end

這樣可以就可以得到 @ascii = "fgnfgbafgafwadsfgewrgtdfgerge" 的結果。

 

二、這種方法非常簡單,就是直接呼叫完整的 method 路徑

ActionController::Base.helpers.some_helper_method

要在 console 中使用必須用這種方法。

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

因為我本身使用 mysql ,所以這篇的範例也是 mysql 。

有時候用 AR 處理比較花時間又沒效率,但實在是需要做某些資料庫的動作時,就會想要直接用 sql 的語法來下指令。

這裡參考一篇文章:Execute sql within rails environment without using your models

rails 本身在 ActiveRecord 中,可以使用 execute method 來下 sql 的指令。但如果想在 rake 檔案裡面寫 sql 語法要怎麼辦呢?

這裡提供了範例:

namespace :db do
  desc "Cleanup the database by setting rows to deleted when older than xxx. Defaults to development database.  Set RAILS_ENV=[production, test, etc.] to override."
  task :cleanup => :environment do
    sql = <<-SQL
      -- 在這裡寫 sql 語法
    SQL
    # used to connect active record to the database
    ActiveRecord::Base.establish_connection
    ActiveRecord::Base.connection.execute(sql)
  end
end

如果你使用的 sql 指令只有一行,也可以只寫最後兩行,然後把敘述的最後面改寫成execute("sql 語法")

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

使用 rails 的一個重要原因,就是可以不用自己造輪子,很多方便的東西都已經寫好。

同時自己必須自我要求,寫出來的 helper 或是 lib ,也要可以重複使用;
或是同一段 code 重複出現太多次,就可以打到 application_controller, application_helper, lib 等地方,(但記得不要濫用)
這也就是 DRY 的意思,Don't Repeat Yourself! 

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html

這個 rails 內建的 helper 非常實用,詳細情況看一眼網頁應該就能明白,
像是 autolink 可以自動將段落文字內的連結自動產生 a 標籤, truncate 可以切斷過長文字並加入繼續閱讀字樣,highlight 可以將指定文字做強調等等等
非常實用!!

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

rake routes

這是用來觀察,你的 rails 專案中,有哪些 routes 可以用。

如果設定 routes.rb 一直搞不定,就下這個指令來觀察吧!

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

logger.info("你想輸出的字串")

這串文字會出現在 /log 裡面的檔案,比方說 production.log
可以觀察到是否出現我們要的結果。 

也有 logger.warn 可以用

參考連結:http://apidock.com/ruby/Logger

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

通常問題是發生在本機端有做更動,遠端的 repository 也有其他人更動過,但是 code 的變動是屬於對立情形,git 無法自動 merge 成功,導致做 git pull 會出現 conflict。

依序指令下 git stash (會先將本機更動的檔案暫存)

git pull (會將 repo 程式碼拉回來並做 merge,其實 pull 指令本來就是 fetch + merge)

git stash apply (將暫存的 code 與現在 pull 後的 code 做 merge)

 

到此會分兩種情形,一種是 apply 成功,那就直接推上去

git commit

git push

另一種是 apply 後會發生 conflict ,這時候就要開啟編輯器,去看有 conflict 的程式碼,手動解決衝突(你會發現程式碼內有標明衝突區段),解完推上去,然後繼續拉 repo 程式碼

git commit

git push

git pull

如果 pull 之後又有 conflict ,就繼續手動解決衝突,然後 push ,反覆此行為直到你 pull 為 up-to-date 的狀態。

笨笨小蟹 發表在 痞客邦 留言(1) 人氣()

如果在 commit 時,指令只有下 git commit ,那後果就是無法清楚的知道本次 commit 的目的,是修正錯誤呢?新增功能呢?還是想完成什麼事情。

這對開發來說是種大忌,因為會造成維護以及交接上的災難,因此每次 commit 時,指令建議下 git commit -m ,這樣就會自動跳到預設編輯器,讓你可以輸入 commit tilte 。

我個人則是習慣直接下 git commit -m "本次 commit 的目的",這樣就會直接出去並填好 commit title ,不會跳編輯器出來。

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

一開始都是很習慣下 git add . 這個指令,會把大部分的更動檔案都加入;

如果有遺漏的(像是 untracked ),就再用 git add -u 加入。

不過實際上在寫 rails 專案時,這種習慣並不好,每次的 git commit -m 應該都有明確的一項任務,比方說某個page、某張ticket、某個任務需求。

推薦在加入檔案時,指令下 git add -i ,也就是互動模式,進入後選2可以選擇哪些檔案要加入,3是移除已加入的檔案,4是加入untracked的檔案。

完成後選1可以確認狀態,然後再下 git commit -m 。

 

附註:git add -i 也可以用來移除不小心加入不該加入檔案的狀況,進去選3就可以移除本次 commit 不想上去的檔案。

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

rails 在執行動作時,預設都是跑 development 環境,利用這一點可以避免下錯指令而把機器弄掛。

在 production 實際運作的平台上,指令一律必須加上 RAILS_ENV=production 才會跑出你想要的結果。

例如 rake db:migrate RAILS_ENV=production

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

指令 annotate

下了之後,會自動幫你塞 data schema 到 model 的 .rb 檔案中!

超好用!

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

Rails 寫好之後,常常需要去查看狀態,最原始的方法就是到 sql 裡面去觀察,不過 Rails 本身也有提供指令可用,就是下 script/console 。

進入console後,可以使用 model 的物件來查看狀態,比方說有個model是 Post ,就可以下 post.last 或是 post.all 等查看狀態。

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()

Rails有很方便的helper可以使用,這是基於 RESTful 而產生的便利物。

但我在初接觸時,常常被名稱中的 s 搞亂,這部份詳細可以參考這篇文章裡的表格。

http://rails.pixnet.net/blog/post/22956704

helper 怎麼產生出來的原理我還沒學到,但是可以注意到,在 config/routes.rb 中加入的名稱,就是 controller 的名稱。

例如:map.resources :blogs

但是如果我的名稱命名時結尾沒有 s 要怎麼辦?這樣 routes 所產生的 helper 就會和常用的規則不一樣.......

所以命名時請養成加 s 的習慣,真的不想加也有解決辦法,就是寫成這樣

map.resources :blogs, :controller => "blog"

笨笨小蟹 發表在 痞客邦 留言(0) 人氣()