我在 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/