在Ruby中使用引号中的通配符运算符?

时间:2012-01-20 08:08:11

标签: ruby-on-rails ruby

我想在rails应用程序中设置一个前置过滤器,如下所示:

before_filter :set_instance_variables, :unless => :active_pages?

def active_pages?
  params[:controller] == "admin/*"
end

我希望它有*表示任何单词,以便该方法检查任何以'admin /'开头的控制器。我认为星号可能是一张外卡并起作用,但似乎没有用。我怎么能做到这一点?

3 个答案:

答案 0 :(得分:6)

def active_pages?
  %r{^admin/.*} =~ params[:controller]
end

它使用=~将String与正则表达式匹配,并使用%r{}作为正则表达式,因为您的模式包含///表示法会更难阅读)。

答案 1 :(得分:1)

这个问题有几种解决方案。从我的观点来看,不涉及正则表达式的最简单的解决方案是String#index

def active_pages?
  params[:controller].index("admin/") == 0
end

另一个解决方案是正则表达式,正如其他用户已经建议的那样。

def active_pages?
  params[:controller] =~ %r{^admin/.*}
end

在这种情况下,我个人更喜欢index解决方案。作为奖励,index似乎比正则表达式更快(实际上差异不是很明显)。

这是一个基准。

require 'benchmark'

array = (1..1000000).map { "string#{rand(4)}/string" }

Benchmark.bmbm do |x|
  x.report("index") { array.each { |item| item.index("string2") == 0 } }
  x.report("regex")  { array.each { |item| item =~ %r{^string2/.*} } }
end

这是结果。

$ ruby index.rb 
Rehearsal -----------------------------------------
index   0.560000   0.020000   0.580000 (  0.582749)
regex   1.000000   0.020000   1.020000 (  1.015548)
-------------------------------- total: 1.600000sec

            user     system      total        real
index   0.570000   0.000000   0.570000 (  0.576076)
regex   0.970000   0.020000   0.990000 (  0.988980)

答案 2 :(得分:0)

使用一些正则表达式

def active_pages?
    params[:controller] =~ /^admin\/\w+$/
end