Ruby on rails 如何向before筛选器发送参数?
我想在我的应用程序控制器中创建一个before_filter方法,如下所示Ruby on rails 如何向before筛选器发送参数?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我想在我的应用程序控制器中创建一个before_filter方法,如下所示 def check_role(role_name) unless logged_in_user.has_role? role_name flash[:notice] = 'Access to that area requires additional privileges.' redirect_to :back end end 然而,在过滤器可以获取参数之前,它看起来并不是这样的 有没有办法将此
def check_role(role_name)
unless logged_in_user.has_role? role_name
flash[:notice] = 'Access to that area requires additional privileges.'
redirect_to :back
end
end
然而,在过滤器可以获取参数之前,它看起来并不是这样的
有没有办法将此调用参数化,或者我正在尝试用锤子拧螺丝?我不相信您可以将参数传递给过滤器。所以我过去所做的是创建静态方法,将参数传递给需要参数的方法 所以我会有这样的东西:
def check_role(role_name)
unless logged_in_user.has_role? role_name
flash[:notice] = 'Access to that area requires additional privileges.'
redirect_to :back
end
end
def check_admin_role
check_role('admin')
end
def check_blah_role
check_role('blah')
end
然后在你的控制器中,你只需呼叫
before_filter :check_admin_role
可能有一些方法可以通过元编程实现这一点,但我仍然是一个相当不错的n00b,还没有弄清楚这一部分;) 您应该能够使用块执行此操作:
before_filter {|controller| controller.check_role('admin') }
您可以使用一些元编程。类似这样的东西(完全未经测试,只是想让你知道它可能会如何发展): 要在应用程序初始化时加载它,只需将它放入名为role_和_it.rb的文件中,并将其放入lib目录 我是不是想用螺丝钉来拧螺丝 锤子 呃,可能;-) 如果我没有看错,您会遇到控制器中的操作具有不同访问级别的情况,因此您希望通过创建单个检查函数来删除重复 你想做这样的事
before_filter :check_role('admin'), :only => [:admin, :debug]
before_filter :check_role('power'), :only => [:edit, :delete]
但帕伦斯事件中的参数是不合法的。不管怎样,我在这里仍然看到了相当多的重复
总的来说,对于一个功能领域以及控制器过滤器,如果你做不到一些事情,可能是因为你看错了东西。(请记住,Rails自豪地将自己描述为“固执己见的软件”!)
如果您能够知道筛选方法中的操作名称,您会怎么做
那我们就
before_filter :check_role
protected
def check_role
for required_role in Perms[params[:action]]
return if logged_in_user.has_role? required_role
end
flash[:notice] = 'Access to that area requires additional privileges.'
redirect_to :back
end
这很漂亮
我们可以在散列中定义权限,也许:
Perms = { :admin => ['admin'], :edit => ['admin', 'power'], etc
。。。它似乎封装了复制的不同元素。如果它变得复杂,那么整个事情可能会转移到一个表中,尽管那时你可能在复制插件中已有的功能
我们会
before_filter :check_role
protected
def check_role
for required_role in Perms[params[:action]]
return if logged_in_user.has_role? required_role
end
flash[:notice] = 'Access to that area requires additional privileges.'
redirect_to :back
end
或者类似的东西。params[:action]适用于我当前的Rails版本(2.1.2),尽管Rails手册(v2)提到了一个
action\u name
方法,对我来说似乎返回空白。这是一个老问题,但如果有人仍然想知道,Rails 4的一个好的asnwer可以找到控制器的值在哪里param get set?在_筛选器将控制器对象生成到块之前。如果您不熟悉Ruby的块格式,那么管道(即| |)将限定传递给块的参数。(仅供参考,您可以在这里随意命名参数;我将其命名为“controller”,以明确传递的内容)谢谢,这也是一个很好的解决方案。我不知道params[:action](说实话,我也得做一些挖掘!)