0

Why would I get NoMethodError on my Heroku app when the same code works flawlessly on my local setup?

The error is triggered by this code:

@customer = Customer.find(1)
@customer.responses.create(:offer_id => '1', :digit => '2')

That code works as intended on my local server and in my local Rails console.

However, on Heroku the above code triggers NoMethodError:

NoMethodError (undefined method `responses' for #<Customer:0x7f7bcbee3808>):

The Response model is tied to the Customer model by means of belongs_to :customer

Additionally, I can login to the Heroku console and run this without any problems:

Response.create(:offer_id => '1', :customer_id => '1', :digit => '2')

So if the above works and both versions work fine on my local box, why would the association fail on Heroku?

--

Running Rails 3.0.6 and tested on Heroku Ruby 1.8.7 and Ruby 1.9.2

Databases are identical on Heroku and on my local box.

4

3 回答 3

2

通常,当这样的事情不起作用时,它表明您缺少has_many关联。如果您希望同时访问它们,则需要定义关联的双方。belongs_tohas_many

从它的声音来看,如果它在您的本地计算机上运行但不是在 Heroku 上运行,那将是因为您没有将更改推送到 Heroku 服务器并在那里重新启动控制台。请确保您已推送更改并重试。

于 2011-04-07T03:07:20.147 回答
1

Marco,我想了一下,我有一些猜测让你试试。在执行上述任一操作之前,请重新启动您的应用程序。有时这会创造奇迹。

heroku restart

好的,现在,在控制台中尝试

@customer.responses

那返回什么?我认为应该是[]。也许做一些检查等可以给我们提供见解。如果您手动构建和关联响应,您可以让它显示出来吗?

其次,你的 no method 错误是 on responses,而不是 on create,所以无论你在那之后输入什么都可能无关紧要,但是,你的offer_idanddigit字段是整数吗?如果是这样,请尝试使用整数而不是字符串来创建它们。与 MySQL 或 SQLite 相比,PostgreSQL 是如此脆弱,我有很多问题可以追溯到我在 Heroku 上开发之前不熟悉使用 Postgre。

@customer.responses.create(:offer_id=>1,:digit=>3)

这可能无关紧要,但值得一试。

要检查的另一件事是您的所有回调和验证等。有什么失败吗?它可能看起来不相关,但我之前遇到过一些问题,因为我忽略了回调中看似微小的无声失败,所以事情表现得很奇怪。我敢肯定你正在测试,但如果你在这个模型的任何地方都有浅层的测试覆盖,你不妨利用这个错误搜寻作为加强它的机会:)

对错误表示同情,我不知道这是否会有所帮助,但祝你好运!如果 Heroku 工作人员发现问题,请发布,我非常有兴趣从中学习!

于 2011-04-07T13:33:35.727 回答
0

我认为您的问题是您如何创建响应:

@customer.responses.create(:offer_id => '1', :digit => '2')

你可能想试试这个。

Response.create(:offer_id => '1', :digit => '2', :customer_id => 1)
于 2011-04-07T01:40:53.903 回答