为什么在我的Heroku应用程序上获得 NoMethodError 时,相同的代码在我的本地设置上完美运行?
此错误由以下代码触发:
@customer = Customer.find(1)
@customer.responses.create(:offer_id => '1', :digit => '2')
该代码在我的本地服务器和本地Rails控制台中按预期工作。
但是,在Heroku上面,上面的代码触发了NoMethodError:
NoMethodError (undefined method `responses' for #<Customer:0x7f7bcbee3808>):
响应模型通过 belongs_to:customer
与客户模型相关联此外,我可以登录Heroku控制台并毫无问题地运行它:
Response.create(:offer_id => '1', :customer_id => '1', :digit => '2')
因此,如果以上工作并且两个版本在我的本地方框上正常工作,为什么关联会在Heroku上失败?
-
运行Rails 3.0.6并在Heroku Ruby 1.8.7和Ruby 1.9.2上进行测试
Heroku和我当地的数据库上的数据库是相同的。
答案 0 :(得分:2)
通常当这样的事情不起作用时,它表示您错过了has_many
关联。如果您希望同时访问它们,则需要定义 belongs_to
和has_many
这两个方面。
听到它的声音,如果它在你的本地机器而不是Heroku上工作那么那将是因为你没有将更改推送到Heroku服务器并在那里重新启动控制台。请确保您已推送更改并重试。
答案 1 :(得分:1)
Marco,我想到了这一点,我有几个猜测让你尝试。在执行上述任一操作之前,请重新启动应用。有时这会创造奇迹。
heroku restart
好的,现在,请在控制台中试试
@customer.responses
返回什么?我认为它应该是[]
。也许做一些检查等可以给我们这里的见解。如果您手动构建并关联响应,可以让它显示出来吗?
其次,你的无方法错误在responses
上,而不在create
上,所以无论你输入什么内容可能无关紧要,但是,你的offer_id
和{{1字段整数?如果是这样,尝试使用整数而不是字符串创建它们。与MySQL或SQLite相比,PostgreSQL非常脆弱,我在Heroku上进行开发之前,已经遇到了很多问题,这些问题可以追溯到我对Postgre的不熟悉。
digit
这可能无关紧要,但值得一试。
要检查的另一件事是你的所有回调和验证等等。有什么失败的吗?它可能看起来似乎并不相关,但我之前遇到过一些问题,因为在我忽略的回调中看似微小的无声失败,事情表现得非常奇怪。我确定你正在测试,但是如果你在这个模型上的任何地方都有浅层测试覆盖率你也可以利用这个bug来获取它的机会:)
对错误的同情,我不知道这有什么帮助,但祝你好运!如果Heroku工作人员发现问题,请发布,我非常有兴趣从中学习!
答案 2 :(得分:0)
我认为您的问题是如何创建响应:
@customer.responses.create(:offer_id => '1', :digit => '2')
您可能想尝试这样做。
Response.create(:offer_id => '1', :digit => '2', :customer_id => 1)