我想在一個導軌應用濾波器之前設置如下:在Ruby中的引號中使用通配符運算符?
before_filter :set_instance_variables, :unless => :active_pages?
def active_pages?
params[:controller] == "admin/*"
end
其中我想它有*表示任何字,使得該方法對任何與啓動控制器檢查'管理/'。我認爲星號可能是一張通配符和工作,但似乎並不奏效。我怎樣才能做到這一點?
我想在一個導軌應用濾波器之前設置如下:在Ruby中的引號中使用通配符運算符?
before_filter :set_instance_variables, :unless => :active_pages?
def active_pages?
params[:controller] == "admin/*"
end
其中我想它有*表示任何字,使得該方法對任何與啓動控制器檢查'管理/'。我認爲星號可能是一張通配符和工作,但似乎並不奏效。我怎樣才能做到這一點?
def active_pages?
%r{^admin/.*} =~ params[:controller]
end
它使用=~
到一個字符串匹配正則表達式,並%r{}
的正則表達式,因爲你的模式包含/
(在//
符號將更難讀)。
使用一些正規表達式
def active_pages?
params[:controller] =~ /^admin\/\w+$/
end
這個問題有幾種解決方案。從我的角度來看,不涉及正則表達式最簡單的辦法是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)
+1,但有正則表達式第一次感覺就像尤達條件;-) –