2013-02-17 118 views
0

Rails的pluralize方法沒有像我想要的那樣工作(單詞不是英文的),所以我着手嘗試自己的解決方案。我在ApplicationController開始用這種方法簡單:Rails返回完整對象而不是整數

def inflect(number, word) 
    if number.to_i > 1 
    word = word + "s" 
    end  
    return "#{number} #{word}" 
end 

並把它稱爲這樣在我看來:

<% @articles.each do |article| %> 
    <%= inflect(article.word_count, "word") %> 
    <%= inflect(article.paragraph_count, "paragraph") %> 
    ... 
<% end %> 

但是,這讓我:

undefined method `inflect' for #<#<Class:0x3ea79f8>:0x3b07498> 

我發現很奇怪的是當我認爲它應該是一個整數時,它引用了一個完整的對象,所以我在控制檯上對它進行了測試:

article = Article.first 
=> (object hash) 
article.word_count 
=> 10 
article.word_count.is_a?(Integer) 
=> true 

所以我扔了一個快速的words = article.word_count.to_i,但它不會拋出TypeError,它實際上什麼都不做,並且仍然返回相同的錯誤:undefined method ``inflect' for #<#<Class:0x3ea79f8>:0x3b07498>參照`inflect(article.word_count, "word")行。

後來我想也許inflect已經是Rails的方法,它是某種命名衝突的,但不要緊,我改變了方法的名稱,它不斷給我同樣的錯誤:undefined method ``whatever' for #<#<Class:0x3ea79f8>:0x3b07498>

我然後在控制檯上測試它,它工作正常。這是怎麼回事?

+1

放入ApplicationHelper你活用方法,而不是ApplicationController中 – house9 2013-02-17 00:05:51

+0

@ house9也做到了,謝謝!你可以擴展爲什麼我應該把它放在那裏,而不是在ApplicationController上? – 2013-02-17 00:24:27

+0

...添加了一些額外的信息作爲答案 – house9 2013-02-18 02:33:00

回答

1

Put your inflect method in ApplicationHelper, not ApplicationController

默認情況下,在你的助手所有的代碼混合到的意見

認爲是其自己的實體,它不是控制器的一部分,當視圖實例被創建(自動當你的控制器動作執行)它會通過您在控制器操作中定義的任何實例變量,但無法直接訪問控制器方法

注意:您可以在控制器中定義方法以使其通過使用helper_method宏暴露給您的視圖 - 請參閱這篇文章的更多信息 - Controller helper_method

但一般而言,您將定義的助手類視圖helper方法,而不是在控制器

+0

很好的答案,謝謝! – 2013-02-19 07:55:36

相關問題