Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何使MyClass.method(:var)和MyClass(:var)在Rails 4中同义_Ruby On Rails_Ruby - Fatal编程技术网

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应用程序中调用时却不能。。