參考文章: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 Wiki 上的文章,告訴你有哪些是保留字,還有一些用了會出問題的字。

Rails 禁用名字列表:
http://wiki.rubyonrails.org/rails/pages/ReservedWords 

笨笨小蟹 發表在 痞客邦 留言(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) 人氣()

1. script/generate scaffold(自己 generate 才會了解流程)

2. elsif,只能用到 if...else...end(原因是寫 elsif 多半會有意圖不明的情況)

3. 在判斷式上下 query (query 會回傳 true)

4. 在 erb 內寫 <% if blah%> <% end %>(這種 code 應該要丟到 helper)

5. 全域變數塞到 environment.rb ,打成 const 來用(多用 const 保持身心健康)

6. 字串不要用+號,改用 "xxx #{blah}" 這種寫法(使用+號時, ruby 會產生新的物件)

7. 變數或 method 名稱不要縮寫,obj 請寫成 object、val 請寫成 value(避免意圖不明)

8. 少用 block ,會有雷(親身慘痛經驗,block call 會根據 erb 呼叫與否決定是否要 return)

9. controller 裡面不要寫 html code,helper 也是,最好用 content_tag 包起來(維持乾淨以及維護方便)

10. 不要在 model 裡面的 method 或 name_scope 內,塞入是 view 所需要但 db 沒有的資訊(MVC架構分層要清楚,每一層都必須吐出該層的 pure data)

11. 如果 plugin 的效果你不滿意的話,不要直接去 hack ,而是利用 ruby 可以 override method 的特性處理。

 

想到再繼續補....

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

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

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

也有 logger.warn 可以用

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

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

雷超大orz

http://github.com/kingpong/ruby-mcrypt

sudo port install libmcrypt +universal

然後先做 symbolic link 把 libmcrypt 連結到 /opt/local
這個步驟忽略的話,下一步的路徑就要指對~

ln -s /opt/local-backup/var/macports/software/libmcrypt/2.5.8_1/opt/local/  libmcrypt(我本機這樣下,但每人電腦或有不同請自行修正~)

sudo gem install kingpong-ruby-mcrypt --source=http://gems.github.com -- --with-mcrypt-dir=/opt/local

然後我用起來,不需要require 'rubygems'

ps. 我這台是ree, gem 1.3.2

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

今天因為測試 css 的 cache,但是跑 development 環境時,cache 並不會有作用,因為本機測試正常,打到 stage 機器上就爆炸了orz

但是這時候,你又已經做了 commit 並 push 到repository 上,要怎麼解決呢?

 

如果你知道是哪一項 commit 造成這個錯誤,可以下 git revert 把那項變更還原,但是如果說想從現在倒回到某次變動(比如倒回4次 commit ),今天學到一個方法。

首先指令下 git reset "某次 commit 的 SHA 值",這裡注意,給出的 SHA 值就會回到那次 commit 結束後的狀態。
例如 git reset a8b5a0afea1e1f5faccda4a698c0002bdcc7bf892

這樣 commit 的狀態就會回到該時間點,但是修改的內容還是目前最新的狀態,因此 git status 會發現這段時間 modified 過的檔案。
接著下 git checkout -f ,checkout可以幫你把更動過的檔案,回到最後一次 commit 時的狀態,所以檔案的狀態就會變成跟倒回的時間點相同。

最後下 git reset original/master,將 commit 的位置直接指向最新的地方,然後 commit 並 push ,就可以看到 repository 又回到你指定時間點的狀態,而且中間變動過的 commit log 也都還在!
注意一點,commit 指向的位置,可能隨著你的專案還不同,像我現在的位置是指向 production/master 。 

 

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

create 和 build 這兩個 method ,要先建立好 model 之間的關連,才會自動產生。
直接使用會出現 undefined method 的錯誤。

http://ihower.tw/training/activerecord.html

可以參看設定關連 Relationship 這一段。

http://blog.mrbrdo.net/2009/10/27/ruby-on-rails-new-vs-create-vs-build/

這個網頁清楚的說明,運行這兩個 method 的差別和 console 執行的結果。

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