通过课堂和课程方法调用Ruby中使用的方法

时间:2014-03-02 04:14:09

标签: ruby-on-rails ruby dry

我在Rails应用程序中有一种情况,我将多次使用类似类型的代码,所以我想我应该尝试干掉它。我对Ruby& Rails和我愿意打赌我已经可以使用某种解决方案 - 所以我很欣赏,但是,我也希望能帮助理解如何最好地解决这个问题。

我觉得我的解决方案,即使可能,也很糟糕 - 但我实际上并不知道,所以我尽力寻求帮助。

以下是我希望重复的两个代码示例:

def index
  if current_user && current_user.admin?
    @users = User.all
  else
    redirect_to root_url, :notice => "Access Unauthorized"
  end   
end

和另一个例子:

def new
  if current_user && current_user.admin?
    @podcast = ApPodcast.new
  else
    redirect_to root_url, :notice => "Access Unauthorized"
  end   
end

我正在使用此条件来确保只有管理员用户才能访问某些页面。除非能找到更好的解决方案,否则我希望能够大量使用这种类型的验证。

但是,我的想法是在ApplicationController中创建一个辅助方法,该方法获取实例变量的名称,类的名称以及要在该类上调用的方法,类似于以下内容:

def admin_auth(instVar, class_to_use, method_call)
  if current_user && current_user.admin?
    instVar = class_to_use.method_call
  else
    redirect_to root_url, :notice => "Access Unauthorized"
  end
end

这是否合理,有效甚至可能?有没有明显更好的方法来解决这个问题?我已经尝试了上面的代码并且基本上会收到错误告诉我“method_call”不存在所以我假设我打电话时:

admin_auth(@user, User, all)

我根本没做对。

同样,任何可以帮助我保持我的代码DRY的解决方案都会得到我所阅读过的每个教程的建议,我们将非常感激 - 但更好的是理解任何更好的解决方案。

感谢。

2 个答案:

答案 0 :(得分:2)

要动态调用类的方法,您需要使用send

def admin_auth(instVar, class_to_use, method_call)
    if current_user && current_user.admin?
        return class_to_use.send(method_call)
    else
        redirect_to root_url, :notice => "Access Unauthorized"
    end
end

您需要将类名称中的传递作为常量,将方法名称作为字符串或符号

传递
> @user = admin_auth(User, :all)
> @user = admin_auth(User, 'all')

答案 1 :(得分:1)

我建议你看看cancan https://github.com/ryanb/cancan