Ruby on rails 如何使MyClass.method(:var)和MyClass(:var)在Rails 4中同义
网上有很多宝石都有这种行为 例如,有这种行为 可以通过以下方式创建对象:Ruby on rails 如何使MyClass.method(:var)和MyClass(:var)在Rails 4中同义,ruby-on-rails,ruby,Ruby On Rails,Ruby,网上有很多宝石都有这种行为 例如,有这种行为 可以通过以下方式创建对象: Fabricate(:person) Fabricate.create(:person) 这就是 但当我试图模仿这种模式时 # app/services/permissions.rb class Permissions def self.call(user) # ... end end def Permissions(user) Permissions.call(user) end 但是权限(用户)总
Fabricate(:person)
Fabricate.create(:person)
这就是
但当我试图模仿这种模式时
# app/services/permissions.rb
class Permissions
def self.call(user)
# ...
end
end
def Permissions(user)
Permissions.call(user)
end
但是权限(用户)
总是返回错误未定义的方法“权限”#
能力模型是
# 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中实现这样的行为呢?根据评论再次更新,并有一个经过测试的解决方法:将
权限方法移动到ability.rb
的顶部,它应该可以工作
问题是rails对于可以从不同文件夹访问的内容有一个很强的约定。服务文件中的全局方法无法从模型访问,这类似于视图辅助对象在模型中不可用的事实 这就是我复制它的方式:
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."
def MyClass(某物)
“{某物}被创造出来了。”
结束
类MyClass
类是def MyClass(var)
在一个模块或类中?您在哪里调用MyClass()?除非您使用的是一个旧的/奇怪的Ruby实现,或者您没有在这里发布其他东西,你的代码应该可以工作。你可以显示整个类吗?在你的权限文件中添加另一个全局方法,看看是否可以从能力模型中调用它。这样,您就可以消除这是发现问题还是名称冲突。然后,将实例方法添加到Permissions.rb中的Permissions类,并查看是否可以从Ability类调用该方法。另外,尝试将permissions方法移动到top ability.rb,看看是否可以修复它(如果可以,并且您只需要在ability类中使用此行为,那么shd是一个合理的选项)。当您在IRB中定义方法(不使用类或模块)时,您正在主对象中定义方法。您只需要确保您不在任何类/模块定义的范围内,只需编写“def MyClass…”等等。Ruby中的所有方法都由一个类或模块持有,如果不明显,则由主对象持有。我的意思是在rails项目中。。。服务是在app/services/permissions.rb中定义的。我们可以看看permissions.rb的源文件吗?是的,问题是:DIf这是整个文件,这很奇怪。像Permissions
这样的方法应该对所有类都可用,包括Ability
,因为它被定义为私有对象方法。我唯一能想到的是,这些文件是否以正确的顺序加载?代码在rails项目中。。。也许它与文件定义的位置有关。。。permissions类是在前面提到的app/services/permissions.rb
中定义的问题中提供的代码可以正常工作,但在rails应用程序中调用时却不能。。