2012-01-20 34 views
1

我想在一個導軌應用濾波器之前設置如下:在Ruby中的引號中使用通配符運算符?

before_filter :set_instance_variables, :unless => :active_pages? 

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

其中我想它有*表示任何字,使得該方法對任何與啓動控制器檢查'管理/'。我認爲星號可能是一張通配符和工作,但似乎並不奏效。我怎樣才能做到這一點?

回答

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

它使用=~到一個字符串匹配正則表達式,並%r{}的正則表達式,因爲你的模式包含/(在//符號將更難讀)。

+0

+1,但有正則表達式第一次感覺就像尤達條件;-) –

0

使用一些正規表達式

def active_pages? 
    params[:controller] =~ /^admin\/\w+$/ 
end 
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)