ruby-on-rails - 将类和方法调用传递给要在 Ruby 中使用的方法

标签 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)

我根本没有做对。

再次强调,任何帮助我保持代码干燥的解决方案都将不胜感激,就像我读过的每个教程所推荐的那样——但比这更好的是理解任何更好的解决方案。

谢谢。

最佳答案

要动态调用类的方法,需要使用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')

关于ruby-on-rails - 将类和方法调用传递给要在 Ruby 中使用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22123755/

相关文章:

ruby - 定义类的不同方式如何影响包含作品的方式?

php - catch 语句中函数的错误处理

ruby-on-rails - 更快地将数据库从一个 heroku 应用程序传输到另一个应用程序

mysql - 在rails deviseomniauth中为多个用户使用OR查询

ruby-on-rails - Rails Ember 混合应用程序

ruby-on-rails - 建模团队

Ruby 实例方法和同名条件局部变量赋值

ruby - 附加到现有字符串

php - 定义可在 laravel 5 中的多个 Controller (简称库)中使用的方法

c# - 为什么 ReadOnlySpan 不能用作泛型委托(delegate)和泛型方法的类型参数?