2011-01-24 47 views
11

我剛剛開始使用Rails,還有很多我仍然需要學習,所以我很可能比正常人更習慣於使用Stackoverflow來詢問初學者的Rails/Ruby問題。助手在rails中的使用

我只是想弄清楚Helpers如何在Rails中工作。從我目前看到的情況來看,Helpers旨在與Views一起使用,而不是與您的控制器一起使用。

但是我想做一個簡單的函數來驗證在params中給出的用戶輸入(檢查是否定義了某些參數並且可選地檢查它們的值是否有效)。

任何人都可以向我解釋什麼是實現這個最好的方式? (請記住,我將要在許多不同的控制器中使用它,因此它應該是全局可用的。)

我還注意到,默認情況下,Rails不會在主應用程序文件夾中生成lib文件夾。開發人員是否將它們的庫放在主文件夾中的應用程序文件夾之外,還是Rails使用不同的庫?

回答

20

關於您的驗證問題,這取決於您正在驗證的內容。

如果數據構成了問題域中的對象,也稱爲模型,那麼您應該使用ActiveModel中內置的驗證器。這可能是你應該做的,但不知道確切的問題很難說。請參閱Rails Guides on Validations。您可以通過詢問自己是否需要驗證的數據在獲取後進行存儲來判斷是否屬於這種情況。如果是這樣,它絕對是一個模型。這種數據的一個例子是從瀏覽器表單發送到Rails的博客文章的標題和文本字段。

如果數據對於您的模型來說是第三級的,或者對於演示文稿而言是特定的,那麼您應該很好地使用助手。你注意到助手主要用在視圖中,雖然這是真的,但是沒有任何東西阻止你在控制器中使用它們,你只需要聲明你將使用ActiveController#helper方法。在ApplicationController課程中,很多開發人員會將helper :all僅包含所有控制器中的所有幫助程序。一旦代碼被需要一次,它不會真的招致大的性能影響。

請注意,幾乎所有傳入的數據都可以使用模型建模。 Rails世界中的一大派思想贊同胖模式的想法。人們說,儘可能在模型中放置儘可能多的代碼,儘可能少地在控制器中儘可能分離問題,並導致更易維護的代碼。這表明,即使您不認爲傳入數據是可模式化的(就您可以創建模型來表示它而言),您應該嘗試使其成爲模型並在驗證它的過程中封裝邏輯。但是,您可能會發現製作輔助函數的速度更快,而且兩者都可以工作。

您驗證用戶輸入的概念是一個很好的概念。我感覺到,由於你是Rails的新手,你習慣於自己做這些事情,但這並不適用於此。在Rails世界中,許多常見的東西,比如驗證,都是由框架處理的。您不必檢查params陣列中的存在,而是在模型上調用validates_presence_of,並讓Rails將錯誤吐出給用戶。從長遠來看,如果讓框架完成設計,它會讓事情變得更加容易。

關於您對lib文件夾的疑問,這並不重要。您可以將其他支持文件和庫放在根目錄中的lib文件夾中,並且它們將可用於您的應用程序(app文件夾中的文件)。您也可以選擇將您的代碼抽象爲插件或寶石,並將其包含在內,這是很多人選擇做的。我的建議是在深入瞭解寶石和插件的概念之前。

+0

感謝hornais,非常有用的解釋!你是對的,我習慣於自己做很多這些事情,而不是讓框架做一些常見的事情。它是有道理的,鐵軌爲你做這個,我只需要適應它。我會嘗試在模型級別驗證輸入。 – Naatan

1

想你想可能是一個自定義的驗證器(在Rails3中):

http://railscasts.com/episodes/211-validations-in-rails-3

您可以添加庫中創建一個文件夾lib,或者他們你添加一個文件添加到config/initializers。 Rails會自動加載initializers目錄中的文件。