我想在rails应用程序中设置一个前置过滤器,如下所示:
before_filter :set_instance_variables, :unless => :active_pages?
def active_pages?
params[:controller] == "admin/*"
end
我希望它有*表示任何单词,以便该方法检查任何以'admin /'开头的控制器。我认为星号可能是一张外卡并起作用,但似乎没有用。我怎么能做到这一点?
答案 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