如何在Rails 4中使MyClass.method(:var)和MyClass(:var)成为同义词

时间:2014-11-12 03:14:51

标签: ruby-on-rails ruby

网上有很多宝石有这种行为

例如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 中实现这样的行为?

2 个答案:

答案 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方法定义,即在所有类或模块之外。