試圖使我存盤在位于的模塊中的方法可用app/models(旁注:不確定這是否是模塊的正確位置?)。
模塊:
module MyModule
class MyClass
def some_method
# do something
end
end
end
用戶模型:
class User < ApplicationRecord
include MyModule
def another_method
some_method
end
end
我收到一個 NoMethodError:
NoMethodError (undefined method 'some_method' for #<User:0x00007f6a3ce452c0>
uj5u.com熱心網友回復:
您似乎誤解了 Ruby 中模塊和類的作用。在 Ruby 中,模塊只是一個包裝了一組方法和常量的物件。
一個模塊可以擴展其他模塊、類和物件,并且可以包含在類中,從而實作多重繼承。Ruby 中的模塊扮演了特征、命名空間和單例在其他語言中所扮演的角色。
類實際上是模塊(模塊是類的祖先鏈的一部分),主要區別在于您可以創建類的實體,并且該類可以從單個其他類繼承,并且不能擴展其他物件或被包含。
這里的代碼示例實際上沒有意義。如果要宣告一個可用于包含模塊的類的方法,則要在模塊本身中宣告它:
module MyModule
def some_method
# do something
end
end
然后,當您呼叫User#another_method它時,它將在 User 類的祖先鏈中查找,直到找到定義在MyModule.
module MyModule
class MyClass
def some_method
# do something
end
end
end
實際上將MyClass使用實體方法定義類,該實體方法僅適用于MyClass. 模塊在這里唯一要做的就是更改模塊嵌套,以便在 MyModule 而不是全域命名空間中定義類。
uj5u.com熱心網友回復:
如果您想將方法中的方法混合到您的類中,那么只需將方法直接放入模塊中(無需中間類)。
模塊:
module MyModule
def some_method
# do something
end
end
用戶模型:
class User < ApplicationRecord
include MyModule
def another_method
some_method
end
end
uj5u.com熱心網友回復:
看看這個答案,你需要先實體化你的類。或者如果你想
class User < ApplicationRecord
include MyModule
def another_method
my_instance = MyClass.new
my_instance.some_method
end
end
至于存放你的模塊的地方,看看這個關于服務物件的指南,它給了我一些關于不同模塊的靈感。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/407152.html
標籤:
下一篇:如何在Ruby中將指標分配給變數
