只是记录一下在项目里遇到的坑,这次的几个坑都是因为nlpir造成的。
项目里用到LDAP,其中有这么一段:
filter = Net::LDAP::Filter.eq("sAMAccountName", user_name)
info = ldap.search(base: "dc=test, dc=cn", filter: filter)
在命令行里单独测试运行正常,但是放在Rails的一个控制器里调用,就会在ldap.search
那行出现这个错误:
ArgumentError (wrong number of arguments (0 for 1..2)):
app/controllers/ldap_controller.rb:17:in `ldap_auth'
...
Stacktrace更是诡异,都到fiddle
去了:
/home/mga/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/fiddle/import.rb:236:in `create_value'
net-ldap (0.7.0) lib/net/ldap.rb:1536:in `block (2 levels) in search'
net-ldap (0.7.0) lib/net/ldap.rb:1532:in `each'
net-ldap (0.7.0) lib/net/ldap.rb:1532:in `block in search'
net-ldap (0.7.0) lib/net/ldap.rb:1447:in `loop'
net-ldap (0.7.0) lib/net/ldap.rb:1447:in `search'
net-ldap (0.7.0) lib/net/ldap.rb:654:in `search'
...
压力山大啊,然后我尝试捕获异常,发现到ldap.search
能拿到结果,只是最后返回值的时候才出异常,于是有了这个解决方法:
filter = Net::LDAP::Filter.eq("sAMAccountName", user_name)
info = nil
begin
ldap.search(base: "dc=pv, dc=do", filter: filter, return_result: false) do |entry|
info = entry
break
end
rescue
end
折腾我了一个下午。
后来用[1..-1]
来取ActiveRecord结果集中第二到最后的元素,居然出现StackOverflow,再试发现只要取下标都会出错,感觉不妙,一定是某个库导入了奇怪的东西。然后一个一个gem关掉,才定位到nlpir, 打开其中主要的一个文件, 开头是这样的:
# coding: utf-8
...
include Fiddle::CParser
include Fiddle::Importer
module Nlpir
...
end
直接在顶层include Fiddle::Importer
, Fiddle::Importer
刚好又定义了[]
……
Mixin用错了就和动态作用域一样坑。