ユーザーエージェントでアクセスを制限

application.rb に追加。

def refuse_ua(condition=nil, &block)
  ret =
    if block
      block.call request.user_agent
    else
      case condition
      when String
        refuse_ua /#{condition}/
      when Regexp
         !condition.match(request.user_agent)
      when Array
        condition.inject true do |ret, cond|
          ret && refuse_ua(cond)
        end
      else
        raise ArgumentError
      end
    end
  unless ret
    erase_redirect_results
    redirect_to :back rescue redirect_to :controller => 'top'
  end
  ret
end

def self.refuse_ua(*args, &block)
  if block
    self.append_before_filter *args do |controller|
      controller.__send__ :refuse_ua, nil, &block
    end
  else
    condition = args.shift
    self.append_before_filter *args do |controller|
      controller.__send__ :refuse_ua, condition
    end
  end
end

使い方

refuse_ua 'MSIE'              # IEにアクセスさせない
refuse_ua ['MSIE', 'Firefix'] # IEとFirefoxにアクセスさせない
refuse_ua {|ua| なんか特殊な条件 }

ちゃんと動いてる気がする。