【问题标题】:NoMethodError undefined method '-@' NoMethodError in Controller Ruby on RailsNoMethodError undefined method '-@' NoMethodError 在控制器 Ruby on Rails
【发布时间】:2013-02-08 05:08:40
【问题描述】:

背景: 我从存储库中提取了最新的代码,并尝试确保我将要推送的更改能够与该版本的代码一起使用。这是一个 Ruby on Rails 应用程序。另外值得注意的是,在运行我从网络上提取的主应用程序时,不会出现此错误。但是,如果我运行我的分支或克隆到我的环境中的主分支,我尝试的每个 url 都会出现错误。所以它在我的尽头。

问题: 我一转到 localhost:3000,就会收到以下错误:

NoMethodError in HomeController#index
undefined method `-@' for #<ActionDispatch::Response:0x64fd460>

我的尝试: 我在 #rubyonrails IRC 频道上提出了我的问题,但没有人能够通过 Full Trace 确定发生了什么(我没有在此处发布,因为我不确定什么是最好的在此处执行此操作的方法;在代码块或块引用中看起来不太好)。我查看了 HomeController 的 index 方法,其定义如下:

    def index
      @groups = @current_user.groups
      @things = Thing.where(:group_id => @groups.map{|e|e.id})
    end

我也用 Google 搜索了一遍,但没有找到解决问题的方法。

到目前为止我学到了什么: -@ 是一个运算符。有些人在假设 Ruby 有快捷方式时可能会收到类似的错误

    variable = variable + 1

许多其他语言都有:

    variable++

这是一个例子:Undefined method `+@' for false:FalseClass (NoMethodError) ruby

问题: 有人对如何在这里找到问题有任何进一步的建议吗?另外,如果我可以轻松地将 Full Trace 放在这里,以美观的方式格式化,有人会告诉我怎么做吗?我对这个不知所措:(

更新(2013 年 2 月 8 日): 似乎问题不一定存在于 HomeController 或 home/index.html.erb 视图中。我试图通过有效的操作访问任何 url,同样的错误发生在“NoMethodError in...”更改为相应的 [...]Controller#index。

更新(2013 年 2 月 9 日): 由于无论我尝试导航到哪个 url,都会发生此错误,因此我决定查看 config 文件夹中的 routes.rb 文件。这次我通过 ruby​​mine 而不是命令行运行我的服务器,这让我更容易阅读。我开始浏览所有吐出的内容,并注意到一条感兴趣的行,其中包括:

["private-key looking thing"] [127.0.0.1] Started GET "/" for 127.0.0.1 at 2013-02-09 18:20:52 -0700

似乎 routes.rb 中存在语法错误(这是我目前最好的猜测)。这并不能解释为什么这只是在具有相同代码集的本地环境中出现的问题,但我还需要解决什么问题?

在我筛选此文件时,是否有人有任何建议要注意的事项?就错误而言,不确定要寻找什么。 Rubymines 检查的东西将我所有的双引号都转换为单引号,并且真的没有什么可抱怨的。

提前致谢, 杰克·史密斯

【问题讨论】:

  • 你能显示你在哪里找到@current_user 吗?
  • -@ 方法对应于一元否定运算符,同样适用于!@+@ 等。显然有人在说-thing,其中thingActionDispatch::Response
  • vijikumar:对于 ruby​​ on rails 世界中的工作方式,我还是很陌生。你能详细说明你的问题吗?你的意思是@current_user 最终定义在哪里?
  • Jake:关闭来自@muistooshort 的非常有用的回复,您应该在您的应用程序中搜索任何包含- thing 的代码。如果这发生在您应用程序中的每条路由上,这意味着违规代码也必须在每个请求上执行,所以它在应用程序控制器或初始化程序中,或者您在任何地方使用的某个模型中......类似的东西。试试这个搜索,看看你能找到什么。
  • 另一个技巧:做小的、增量的提交,不断地测试,然后当你遇到像这样的神秘错误时,你可以回到上一次提交并一点一点地重新实现你的更改,直到出现错误再次出现。有时这是追踪非常罕见的错误的最佳方式。

标签: ruby-on-rails controller nomethoderror unary-operator


【解决方案1】:

我猜这也可能是相应视图页面 Home/index.html.haml 中的语法错误。我怀疑变量调用前面有意外的“-”。我试图在我的 Rails 平台中模拟类似的场景,并在浏览器上查看以下页面

undefined method `-@' for false:FalseClass

正确的代码行

%h1 All Movies
= "filtervalue=#{@isFilterOld}"
= "Sortvalue=#{@isSortOld}"

编辑以模拟错误(观察 isFilterOld 变量前面的 -)

   %h1 All Movies
    = "filtervalue=#{-@isFilterOld}"
    = "Sortvalue=#{@isSortOld}"

【讨论】:

  • prashantsunkari:感谢您的建议,这似乎与我上面提到的错误“未定义方法'+@'”类似的原因。变量定义前必须有一个“-”,或者像您建议的那样使用。一旦我能够验证这一点,我将发布我的结果。再次感谢!
  • prashantsunkari:我在 app/views/home/index.html.erb 中找不到任何问题。我想知道它还能是什么?
  • 抱歉,评论迟了。我不确定是什么原因造成的,除了我在上面的输入之外……很高兴你找到了解决办法,如下所示!
【解决方案2】:

我已经解决了这个问题!

解决了什么问题:

  1. 转到 gem 所在的目录(对我来说是 C:\RailsInstaller\Ruby1.9.3\lib\ruby\gems\1.9.1)
  2. 删除除 bundler 之外的所有 gem
  3. 确保从 /cache/、/gems/ 和 /specifications/ 文件夹中删除 gem(我刚开始时只是从 /gems/ 文件夹中删除了它们,bundle install 表示它仍然可以找到 gem)
  4. 运行bundle install

进一步查询:

有人知道为什么会这样吗?我不知道此时我是否可以缩小导致问题的范围,因为该应用程序现在正在运行(我可以访问所有具有相应视图的 url)。如果问题再次出现,我将一一删除宝石以确定哪一个至少对我造成了问题。但是,如果有人对此有任何见解,我认为,除了我之外,还有更多的人会非常感谢更详细的答案。感谢所有迄今为止提供帮助的人!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    相关资源
    最近更新 更多