网上有很多宝石有这种行为
例如Fabrication Gem有此行为
您可以通过
创建对象Fabricate(:person)
Fabricate.create(:person)
这就是code 但是当我试图模仿那种模式时
# app/services/permissions.rb
class Permissions
def self.call(user)
# ...
end
end
def Permissions(user)
Permissions.call(user)
end
但Permissions(user)
始终返回错误undefined method 'Permissions' for #<Ability:0x007ff6ea78de88>
能力模型
# app/models/ability.rb
class Ability
# ...
def initialize(user)
if user.role == 'Admin'
# ....
elsif user.role == 'Manager'
Permissions(user) # wont work
Permissions.call(user) # works fine
end
end
end
代码很好但是在rails应用程序中调用它不起作用 ..那么如何在Rails 中实现这样的行为?
答案 0 :(得分:0)
根据评论再次更新,并使用经过测试的解决方法:将permissions
方法移至ability.rb
的顶部,它应该可以正常运行。
问题在于rails对于可以从不同文件夹访问的内容有一个强烈的约定。无法从模型访问服务文件中的全局方法,类似于视图助手在模型中不可用的事实。
答案 1 :(得分:0)
这就是我复制它的方式:
def MyClass(something)
"#{something} was created."
end
class MyClass
class << self
alias_method :create, :MyClass # MyClass as in Object's private method!
end
end
MyClass(:rock) #=> "rock was created."
MyClass.create(:gem) #=> "gem was created."
编辑:我还不能发表评论,因为我的帐户是新的,但如果我没弄错,你的Permissions
方法正在另一个类/模块中定义。你想要做的是在Permissions
Ruby对象中创建main
方法定义,即在所有类或模块之外。