2011-06-09 78 views
8

有人知道爲什麼包含的方法在類方法中不起作用嗎?Rails在類方法中使用包含的幫助程序

class MyClass 
    include ActionView::Helpers::NumberHelper 

    def test 
    puts "Uploading #{number_to_human_size 123}" 
    end 

    def self.test 
    puts "Uploading #{number_to_human_size 123}" 
    end 
end 


ree-1.8.7-2011.03 :004 > MyClass.new.test 
Uploading 123 Bytes 
=> nil 
ree-1.8.7-2011.03 :005 > MyClass.test 
NoMethodError: undefined method `number_to_human_size' for MyClass:Class 
    from /path/to/my/code.rb:9:in `test' 
    from (irb):5 
ree-1.8.7-2011.03 :006 > 

回答

5

很難說沒有看到你的助手代碼,但include將插入所有這些模塊中的方法分爲情況下,你包括到類的extend用於將方法帶入。因此,如果你只有在NumberHelper中定義的方法,這些方法將被放到MyClass的所有實例上,但不放在類中。

很多Rails擴展工作的方式是使用已整合到ActiveSupport :: Concern中的技術。 Here是一個很好的概述。

從本質上講,擴展模塊中的ActiveSupport :: Concern將允許您在稱爲ClassMethods和InstanceMethods的子模塊中指定要將哪些函數添加到包含模塊的類和實例中。例如:

module Foo 
    extend ActiveSupport::Concern 
    module ClassMethods 
     def bar 
      puts "I'm a Bar!" 
     end 
    end 
    module InstanceMethods 
     def baz 
      puts "I'm a Baz!" 
     end 
    end 
end 

class Quox 
    include Foo 
end 

Quox.bar 
=> "I'm a Bar" 
Quox.new.baz 
=> "I'm a Baz" 

我用這個之前做的事情一樣定義ClassMethods酒吧功能,那麼也將其提供給實例通過定義一個只是調用this.class同名的杆法。酒吧,使它可以從兩者中調用。 ActiveSupport :: Concern還提供了許多其他有用的功能,例如允許您定義在包含模塊時被回調的塊。現在

,這是專門在這裏發生的事情,因爲你是include荷蘭國際集團的幫助,這可能表明,這個功能是更通用比幫手 - 傭工只自動包含在意見,因爲它們只以幫助觀點。如果你想在視圖中使用你的助手,你可以在你的類中使用helper_method宏來讓你的視圖看到該方法,或者,甚至更好的方法是像上面那樣創建一個模塊,而不是將其視爲助手,而是使用包括混合它到你想要使用它的類中。我想我會走這條路 - 沒有什麼說你不能在HumanHadperNumber模塊中創建HumanReadableNumber模塊,並且它在NumberHelper中使它易於在視圖中使用。

6

我面臨同樣的問題。以下是我如何解決它,

helper = Object.new.extend(ActionView::Helpers::NumberHelper) 
helper.number_to_human_size(1000000) 

感謝RailsForum

+0

非常直接的解決方案..謝謝:) – SSR 2015-03-12 10:24:15

+0

如果幫你請標明正確:) – 2015-03-12 17:18:33

+0

這不是我的問題,所以我不能接受你的答案爲可接受的。 :( – SSR 2015-03-13 04:30:11