2011-07-01 19 views
11

我一直在研究我的第一個Rails 3插件,以打包一個簡單的幫助函數,我喜歡在我的所有應用程序的ApplicationHelper中使用這個函數。你可以看到整個代碼on Github創建一個簡單的Rails 3文本幫手Gem

這是我第一次嘗試:

## lib/semantic_id.rb ## 

require 'semantic_id/version' 

module ::ActionView::Helpers::TextHelper 

    def semantic_id 
    string = String.new 

    case 
    when controller.action_name =~ /new|edit/ 
     string += controller.action_name + "_" 
    when controller.action_name =~ /index|create/ 
     string += controller.controller_name 
    else 
     string += controller.controller_name.singularize 
    end 

    string += "_view" 
    end 

end 

現在,這個工作,但據我所知,這是延長的ActiveSupport或任何其他的Rails模塊的不是「Rails 3的道路」。我一直無法找到關於如何「構建」構建Rails 3 Gem的文檔。我嘗試了下Rails指南,但是添加助手的方法不起作用,否則我錯過了一些東西。

我的問題是:給出上面的代碼作爲我正在尋找的功能的一個例子,你會如何將它變成一個Rails 3插件寶石?

謝謝!

+0

你應該嘗試使用珠寶商寶石創建你的寶石:) – corroded

+1

關於給出的答案,我被撕裂,因爲我依靠兩者來解決這個問題。 Alex的代碼讓我接近了,但我仍然很難弄清楚如何使它加載到應用程序中,直到Noli將他的鏈接發佈到更好的示例如何將railtie放在一起。所以最終,Alex的回答讓我開始了,而Noli的幫助我完成了。在這種情況下,我必須和諾利一起去,因爲他的聯繫最終會產生變化。謝謝你們的體貼回答! – Andrew

回答

17

你所做的事情的問題是你已經將你的寶石功能綁定到ActionView。將它更通用化會更好。

要解決這個問題,您應該將代碼打包到自己的模塊中,然後將該模塊注入到您的視圖環境中。例如,把你的助手到其自己的模塊(和文件):

# lib/semantic_id.rb 

require 'semantic_id/helper' 

ActiveSupport.on_load(:action_view) do 
    include SemanticId::Helper 
end 

你想從助手的功能部分分開:

# lib/semantic_id/helper.rb 

module SemanticId 
    module Helper 
    def semantic_id 
     ... 
    end 
    end 
end 

然後用Railtie它添加到的ActionView將其插入到框架中的部分。你的方法包含了一些Rails特定的代碼,但是如果它沒有,這種技術將允許你將它與Sinatra和其他框架一起使用。

一般來說,您的項目應該在lib/<project_name>/*.rblib/<project_name>.rb應該只是使功能可訪問的膽量。

+0

這有助於,謝謝。 – Andrew

+0

但是,你會如何測試模塊內的方法?你不需要把它包括在課堂上嗎? – Mohamad

相關問題