我需要在 :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:
错误在哪里??