未定义的方法`+@';对于nil:nilclassrails在迁移到mysql之后
我把数据库移到了云主机上的mysql上。移动数据库后,当我试图访问或将数据保存到数据库时,我开始出现此错误,但一些模型更新工作正常 我正在访问的模型有一些算术计算,我觉得这就是这个问题的原因 错误是未定义的方法`+@';对于nil:nilclassrails在迁移到mysql之后,mysql,ruby-on-rails,ruby,ruby-on-rails-4,Mysql,Ruby On Rails,Ruby,Ruby On Rails 4,我把数据库移到了云主机上的mysql上。移动数据库后,当我试图访问或将数据保存到数据库时,我开始出现此错误,但一些模型更新工作正常 我正在访问的模型有一些算术计算,我觉得这就是这个问题的原因 错误是 undefined method `+@' for nil:NilClass 我也从rails控制台进行了尝试,但这个命令也出现了同样的错误 设置。全部 我想这是那种方法的一部分 if params[:lat] and params[:lon] and params[:rad] and !para
undefined method `+@' for nil:NilClass
我也从rails控制台进行了尝试,但这个命令也出现了同样的错误
设置。全部
我想这是那种方法的一部分
if params[:lat] and params[:lon] and params[:rad] and !params[:lat].empty? and
!params[:lon].empty? and !params[:rad].empty?
lat = params[:lat].to_f
lon = params[:lon].to_f
rad = params[:rad].to_f
ear = 6371.00
min_lat = (lat) - (rad/ear)/180.0*Math::PI;
max_lat = (lat) + (rad/ear)/180.0*Math::PI;
min_lon = (lon) - (rad/ear/Math.cos(lon*Math::PI/180.0))/180.0*Math::PI;
max_lon = (lon) + (rad/ear/Math.cos(lon*Math::PI/180.0))/180.0*Math::PI;
@settings = @settings.includes(:settings_location)
.where("settings_locations.latitude > :min_lat AND " \
"settings_locations.latitude < :max_lat AND " \
"settings_locations.longitude > :min_lon AND " \
"settings_locations.longitude < :max_lon", {
min_lat: min_lat,
max_lat: max_lat,
min_lon: min_lon,
max_lon: max_lon});
根据这些评论,似乎只有少数情况下您可以在IRB中重现相同的错误消息。第一个是:
foo, bar = nil, nil
foo.send("+@", bar) # undefined method `+@' for nil:NilClass
二是:
foo = nil
+foo # undefined method `+@' for nil:NilClass
在eval
上下文中,后者可能更像:
foo, bar = nil, nil
eval("foo = +#{bar.inspect}") # undefined method `+@' for nil:NilClass
我个人的猜测是,你的问题与后者类似。不是使用eval
,而是使用其众多Ruby变体之一,如define\u method
。实际的调用很可能在Rail内部的某个地方,并且与某个未初始化的变量相关——也许MySQL返回null,而SQLite返回的是您没有想到的最近的模式更改导致的结果
就我个人而言,我会一步一步地缩小范围:
一,。点评:
json.location settings_location.to_builder
如果错误消失,则:
2.a)替换为:
builder = settings_location.to_builder
json.location builder
如果错误消息仍然相同,则:
2.b)试试看
…没有障碍
关键是,您希望将范围缩小到导致错误的特定方法,然后深入研究该方法的代码,看看哪些是nil,哪些不应该。(也许块缺少某种返回值?现在很难判断哪一行是第54行:)现在你应该找到哪一个变量(在那一行)是
nil
并通过调用堆栈进行跟踪,该调用堆栈应设置在该调用堆栈中。第54行是settings.rb文件中的行尾,跟踪后,我达到了我上面提到的方法…:(你的设置是什么。rb
内容?@Denis是的,真的是+@
,这是一元+
操作符。试着运行这个:+nil
。在我看来,这不像完整的堆栈跟踪。Rails默认情况下隐藏了几个步骤。如果你在浏览器中打开页面,获取堆栈跟踪,然后单击“完整”,你会得到更多的跟踪吗全面的stacktrace?(或者,如果您不想在服务器上执行此操作,您可以添加一个gem来邮寄错误,或者使用诸如sentry或appsignal之类的服务来跟踪错误)感谢您的回答,但它不起作用,我非常确定我没有更改任何迁移文件,所以我想没有任何模式更改的机会,现在我将尝试分析每一个和所有内容…我不知道,我尝试了几乎所有我可以做的,但同样的结果尝试调试它与各种宝石,但无法解决问题…我评论ed完全设置模型,但仍然是相同的问题…还有其他建议吗please@user1618:通过注释掉代码直到它消失,您是否成功隔离了触发错误的原因?我逐个注释掉了完整的设置模型..但在运行“settings.all”时,找不到它消失的行从任何地方都会出现相同的错误…我删除了许多已定义的关系…我正在使用MySql的是mariaDB吗?或者任何其他建议…坦率地说,我不认为我或任何其他人可以做更多的事情来帮助目前的情况。在我做的事情中,强调我将如何继续调试这是我能做的最好的事情,即评论事情直到错误消失,取消注释,然后深入到相关函数的代码中,注释掉其中的内容,直到错误消失,依此类推,直到剥离所有层并确定真正触发错误的较低级别代码。从那里,您将知道什么参数是罪魁祸首,并且可以跟踪使用调用者
确定原因,将其返回到其来源。
json.location settings_location.to_builder
builder = settings_location.to_builder
json.location builder
Jbuilder.new