Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何向before筛选器发送参数?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何向before筛选器发送参数?

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 然而,在过滤器可以获取参数之前,它看起来并不是这样的 有没有办法将此

我想在我的应用程序控制器中创建一个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_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](说实话,我也得做一些挖掘!)