0

我需要在 :json 中为我的主干应用程序接收 current_user 的所有功能。所以第一个想法是添加一些这样的想法:

def receive_user_abilities # we will return onty hash for works and tasks
    w = Work.accessible_by(current_ability).map { |w| w = {type: 'Work', id: w.id}) }
    t = Task.accessible_by(current_ability).map { |t| t = {type: 'Task', id: t.id}) }
    render json:  t + w # returs merged hash
end

但两条线都特别相同,我决定使用一些元编程魔法。所以我的解决方案是创建新的助手,将其包含到我的控制器中,并将 *arg 传递给新创建的模块(助手)方法。这里是:

 module AbilitiesHelper
  def receive_abilities_for *classes
    classes.inject([]) { |res, klass| res + eval( klass.to_s.capitalize + '.accessible_by(current_ability).map { |element| element = ({type: ' + klass.to_s.capitalize + ', id: element.id }) }') }
  end
end

这是来自控制器的新呼叫

def receive_user_abilities
    render json: receive_abilities_for(:work, :task) # returs merged hash
  end

基本相同,但由于某种原因我收到错误SystemStackError - stack level too deep:

错误在哪里??

4

1 回答 1

1

也许这种方法会更容易?

def receive_abilities_for *classes
  classes.inject([]) do |res, klass| 
    res + klass.accessible_by(current_ability).map do |element| 
      element = {type: klass.to_s, id: element.id } 
    end
  end
end

并以这种方式调用此方法:

def receive_user_abilities
  render json: receive_abilities_for(Work, Task)
end

另外,就我而言,receive_abilities_for方法不是元编程。元编程是在运行时定义新的方法和类(我可能弄错了)。

于 2013-08-29T10:06:28.030 回答